我试图在我自己的包中使用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)
}
Run Code Online (Sandbox Code Playgroud)
当我在常规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
Run Code Online (Sandbox Code Playgroud)
当我将此函数放入包中时,安装包,加载包,然后运行该函数,我收到一条错误消息.
> 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
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么会发生这种情况以及我可以做些什么来解决它.很感谢任何形式的帮助.
我在将data.table用于roxygen2导出函数时遇到问题.
这是一个名为foo.R的文件中的一个简单的假函数(位于我的包的R目录中),它使用data.table:
#' Data.table test function
#' @export
foo <- function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
Run Code Online (Sandbox Code Playgroud)
如果我将此函数复制并粘贴到R中,此函数可以正常工作:
> foo <- function() {
+ m <- data.table(c1 = c(1,2,3))
+ print(is.data.table(m))
+ m[,sum(c1)]
+ }
> foo()
[1] TRUE
[1] 6
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是加载导出的函数,R认为data.table是一个data.frame并且中断:
> rm(foo)
> load_all()
Loading test_package
> foo
function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
<environment: namespace:test_package>
> foo()
[1] TRUE
Error in `[.data.frame`(x, i, j) : object 'c1' not found
Run Code Online (Sandbox Code Playgroud)
这是怎么回事? …