我正在尝试在我自己的包中使用data.table包。 MWE如下:
我创建了一个函数test.fun,它只是创建一个小的data.table对象,然后将“Val”列分组加“A”列。代码是
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
任何人都可以向我解释为什么会发生这种情况以及我可以采取哪些措施来解决这个问题。非常感谢任何帮助。
答案 0 :(得分:83)
Andrie猜测是对的,+ 1。有关于它的常见问题解答(请参阅vignette("datatable-faq")
),以及导入data.table
的新vignette:
FAQ 6.9:我创建了一个依赖于data.table的包。我如何能 确保我的包是data.table-aware,以便从中继承 data.frame有效吗?
i)在描述文件的
data.table
字段中包含Depends:
,或ii)在描述文件的data.table
字段中包含Imports:
并{{1在你的NAMESPACE文件中。
更多背景...在import(data.table)
(和其他[.data.table
个功能)的顶部,您会看到一个切换,具体取决于对data.table
的调用结果。这代表呼叫环境数据表感知。键入cedta()
会显示它是如何完成的。它依赖于具有命名空间的调用包,以及data.table:::cedta
上的命名空间Import'ing或Depend'ing。这就是data.table
可以传递给非 data.table-aware 包(例如data.table
中的函数)的方式,这些包可以使用绝对标准的base
[.data.frame
上的语法,幸福地不知道data.table
data.frame
和is()
。
这也是为什么data.table
继承不与无命名空间包兼容的原因,以及为什么在用户请求时我们不得不要求这些包的作者在其包中添加一个名称空间以便兼容。令人高兴的是,既然R为缺少一个的软件包添加了一个默认的命名空间(从v2.14.0开始),那个问题已经消失了:
版本变更2.14.0
*所有包必须具有命名空间,如果未在源中提供,则在安装时创建一个。
答案 1 :(得分:21)
以下是完整的食谱:
1)在data.table
文件中将Imports
添加到DESCRIPTION
。
2)将@import data.table
添加到您的相应.R文件(即包含导致错误Error in [.data.frame(x, i, j) : object 'Val' not found
的函数的.R文件中)。
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