1

我正在尝试构建一个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 函数,我通过 data(list1) 调用列表,然后fc<-list[[1]]在函数内部调用。

我也做了data(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(我认为这可能是原因,但不知道。)

4

1 回答 1

1

你确定R版本在这里兼容吗?ecdf() 和对象的内部部分approxfun(){是的,它们函数}最近发生了变化,现在通过.approxfun(..)隐藏在“stats”命名空间中的包装器进行。

但我真的认为问题出现了,因为您使用 data(.) 以便在包中使用此类对象,并且在 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()ing。

解决方案建议:不要data()用于存储函数内部使用的对象。 data()根本不考虑这个(而是提供有启发性的数据集)。

而是将其放入 /inst/internal/ecdf_lst.rda 之类的东西中,然后通过类似的东西将其放入您的函数中 load(system.file("internal/ecdf_lst.rda", package="<pkg>"))

于 2013-09-13T07:46:23.073 回答