如何在R包中使用ecdf对象?

时间:2013-09-13 03:15:08

标签: r package building ecdf

我正在尝试构建一个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(我认为这可能是原因,但不知道。)

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>"))