我正在尝试构建一个R
包,其中包含多个 ecdf 对象。它们是由ecdf(一些变量,如p1)创建的。我将它们放在一个列表中并将其保存为数据文件夹中的 rda 文件,但是当我在安装包后运行包内的函数(假设名为b1)时,我收到以下错误:
b1(zzz[1,]) (zzz is a data frame and I ran the function on one row of it)
Error in fc(p1) : could not find function ".approxfun"
fc是存储在保存列表中的ecdf函数,我在函数内部按数据(list1)调用列表,然后调用fc<-list[[1]]
。
我也做了数据(list1),当我输入:fc<-list1[[1]]
时,我可以看到fc作为ecdf对象,但是当我输入fc(1)
时,我收到以下错误:
Error in fc(1) : could not find function ".approxfun"
如果我选择R来选择fc作为函数或数据,当我使用package.skeleton并将fc放入mylist时,它选择作为函数,并创建fc.R,但它不运行,某事这样将保存在fc.R中:
fc <-
structure(function (v)
.approxfun(x, y, v, method, yleft, yright, f), class = c("ecdf",
"stepfun", "function"), call = quote(ecdf(yyy$p1)))
然而,对象fc是:
Empirical CDF: 4825 unique values with summary <br/>
Min. 1st Qu. Median Mean 3rd Qu. Max. <br/>
0.01227 0.03857 0.05602 0.10730 0.15250 0.68020 <br/>
我非常感谢能得到的任何帮助。非常感谢你提前的时间。 我想我需要弄清楚我应该如何为建筑包保存fc。统计数据库版本是3.0.1(我认为这可能是原因,但不知道。)
答案 0 :(得分:1)
你确定 R 版本在这里兼容吗?
ecdf()
和approxfun()
个对象的内部部分{是,它们是函数}最近已经更改,现在通过隐藏的.approxfun(..)
包装器进行更改在“stats”命名空间中。
但我真的认为问题来了,因为你使用数据(。)来在你的包中使用这些对象,
在R包装构建中,R可能会重新保存数据并最终丢失重要的财产
environment(fc)
必须"stats"
作为父级环境。
> set.seed(7); Fn <- ecdf(rnorm(12))
> save(Fn, file="/tmp/Fn.rda")
> rm(Fn)
> load(file="/tmp/Fn.rda")
> Fn
Empirical CDF
Call: ecdf(rnorm(12))
x[1:12] = -1.1968, -0.97067, -0.94728, ..., 2.2872, 2.7168
> plot(Fn)
> Fn(1)
[1] 0.75
> q()
... restart R
> (load(file="/tmp/Fn.rda"))
[1] "Fn"
> Fn(1)
[1] 0.75
> parent.env(environment(Fn))
<environment: namespace:stats>
所以一切都适用于ecdf对象的常规save()ing和load()。
解决方案建议:不要使用data()
来存储函数内使用的对象。
data()
完全没有考虑到这一点(而是提供有启发性的数据集)。
而是将其放入/inst/internal/ecdf_lst.rda之类的内容中
并通过类似的东西将它带入你的功能
load(system.file("internal/ecdf_lst.rda", package="<pkg>"))