84

我正在尝试在我自己的包中使用 data.table 包。MWE如下:

我创建了一个函数 test.fun,它只是创建了一个小的 data.table 对象,然后对“A”列分组的“Val”列求和。代码是

test.fun<-function ()
{
    library(data.table)
    testdata<-data.table(A=rep(seq(1,5), 5), Val=rnorm(25))
    setkey(testdata, A)
    res<-testdata[,{list(Ct=length(Val),Total=sum(Val),Avg=mean(Val))},"A"]
    return(res)
}

当我在常规 R 会话中创建此函数,然后运行该函数时,它按预期工作。

> res<-test.fun()
data.table 1.8.0  For help type: help("data.table")
> res
     A Ct      Total        Avg
[1,] 1  5 -0.5326444 -0.1065289
[2,] 2  5 -4.0832062 -0.8166412
[3,] 3  5  0.9458251  0.1891650
[4,] 4  5  2.0474791  0.4094958
[5,] 5  5  2.3609443  0.4721889

当我将此函数放入一个包中,安装包,加载包,然后运行该函数时,我收到一条错误消息。

> library(testpackage)
> res<-test.fun()
data.table 1.8.0  For help type: help("data.table")
Error in `[.data.frame`(x, i, j) : object 'Val' not found

任何人都可以向我解释为什么会发生这种情况以及我可以做些什么来解决它。很感谢任何形式的帮助。

4

2 回答 2

96

安德烈的猜测是正确的,+1。上面有一个常见问题解答(请参阅参考资料vignette("datatable-faq")),以及一个关于导入的新小插曲data.table

FAQ 6.9:我创建了一个依赖于 data.table 的包。如何确保我的包支持 data.table,以便从 data.frame 继承有效?

i) 包含data.tableDepends:您的说明文件字段中,或 ii) 包含data.tableImports:您的说明文件字段和import(data.table)命名空间文件中。

进一步的背景......在[.data.table(和其他data.table功能)的顶部,您会看到一个开关,具体取决于对cedta(). 这代表调用环境数据表感知。打字data.table:::cedta揭示了它是如何完成的。它依赖于具有命名空间的调用包,以及该命名空间 Import'ing 或 Depend'ing on data.table。这就是如何data.table将其传递给非data.table-aware包(例如 中的函数base)并且这些包可以在 上使用绝对标准[.data.frame的语法,而data.table幸福地不知道data.frame is()adata.table也是如此。

这也是为什么data.table继承不与无命名空间的包兼容的原因,以及为什么在用户请求时我们必须要求此类包的作者在他们的包中添加命名空间以使其兼容。令人高兴的是,现在 R 为缺少一个的包添加了一个默认命名空间(从 v2.14.0 开始),这个问题已经消失了:

R 版本 2.14.0 中的更改
* 所有包都必须有一个命名空间,如果源中没有提供,则在安装时创建一个。

于 2012-05-10T08:08:33.793 回答
37

这是完整的食谱:

  1. 添加data.tableImports您的DESCRIPTION文件中。

  2. 添加@import data.table到您各自的 .R 文件(即,包含引发错误的函数的 .R 文件Error in [.data.frame(x, i, j) : object 'Val' not found)。

  3. 键入library(devtools)并将您的工作目录设置为指向 R 包的主目录。

  4. 键入document()。这将确保您的NAMESPACE文件包含import(data.table)一行。

  5. 类型build()

  6. 类型install()

有关做什么build()install()做什么的不错的入门,请参阅:http: //kbroman.org/pkg_primer/

然后,一旦您关闭您的 R 会话并下次登录,您可以立即使用:

  1. 类型library("my_R_package")

  2. 键入上述 .R 文件中包含的函数的名称。

  3. 享受!你不应该再收到可怕的Error in [.data.frame(x, i, j) : object 'Val' not found

于 2016-04-29T05:59:38.660 回答