在我自己的包中使用data.table包
我正在尝试在我自己的包中使用data.table包。 MWE如下:
我创build一个函数test.fun,它只是创build一个小的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会话中创build此函数,然后运行该函数时,它按预期工作。
> 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
有人可以向我解释为什么会发生这种情况,我可以做些什么来解决这个问题。 任何帮助非常感谢。
安德里的猜测是正确的,+1。 有一个常见问题(见vignette("datatable-faq")
):
FAQ 6.9:我创build了一个依赖于data.table的包。 我如何确保我的包是data.table-aware,以便从data.frameinheritance工作?
或者i)在描述文件的
Depends:
域中包含data.table
,或者ii)在DESCRIPTION文件的Imports:
域中包含data.table
,在NAMESPACE文件中包含import(data.table)
。
进一步的背景…在[.data.table
(和其他data.table
函数)顶部,您将看到一个开关,取决于对cedta()
的调用结果。 这代表呼叫环境数据表意识。 键入data.table:::cedta
揭示了它是如何完成的。 它依赖于具有名称空间的调用包,以及该名称空间导入或依赖data.table
。 这是如何data.table
可以传递到非data.table知道包(如base
函数),这些包可以使用绝对标准[.data.frame
语法, data.table
,幸福不知道data.frame
is()
一个data.table
。
这也是为什么data.table
inheritance没有使用与名称空间包兼容的原因,为什么在用户请求时我们不得不要求这些包的作者添加一个名称空间到他们的包来兼容。 令人高兴的是,既然R为缺less一个(从v2.14.0开始)的软件包添加了默认命名空间,那么这个问题就消失了:
R版本的变化2.14.0
*所有软件包都必须有一个名称空间,如果没有在源代码中提供,则会在安装时创build一个名称空间。
这是完整的配方:
1)在您的DESCRIPTION
文件中添加data.table
到Imports
。
2)将@import data.table
添加到您的相应.R文件(即.R文件,该文件包含Error in [.data.frame(x, i, j) : object 'Val' not found
错误Error in [.data.frame(x, i, j) : object 'Val' not found
)。
3)键入library(devtools)
并设置你的工作目录指向R包的主目录。
4)inputdocument()
。 这将确保您的NAMESPACE
文件包含一个import(data.table)
行。
5)typesbuild()
6)inputinstall()
有关build()
和install()
,请参阅: http : //kbroman.org/pkg_primer/ 。
然后,一旦您closuresR会话并下次login,您可以立即跳入:
1)typeslibrary("my_R_package")
2)input上面提到的.R文件中的函数名称。
3)享受! 你不应该再Error in [.data.frame(x, i, j) : object 'Val' not found
可怕的Error in [.data.frame(x, i, j) : object 'Val' not found