我在让 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)]
}
如果我将此函数复制并粘贴到 R 中,则该函数可以正常工作:
> foo <- function() {
+ m <- data.table(c1 = c(1,2,3))
+ print(is.data.table(m))
+ m[,sum(c1)]
+ }
> foo()
[1] TRUE
[1] 6
但如果我只是加载导出的函数,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
这是怎么回事?
UPDATE
感谢@GSee 的帮助。看来这实际上是一个开发工具问题。查看下面的交互式命令行代码。
加载test_package库后,foo
正确运行:
> 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
[1] 6
Running load_all()
刹车食物:
> load_all()
Loading test_package
> foo()
[1] TRUE
Error in `[.data.frame`(x, i, j) : object 'c1' not found
Somehow source('R/foo.R')
恢复 foo 功能:
> source('R/foo.R')
> foo
function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
> foo()
[1] TRUE
[1] 6
以及未来的电话load_all()
不要打破foo
again:
> load_all()
Loading test_package
> foo
function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
> foo()
[1] TRUE
[1] 6
另外,我更新到 devtools 1.5 并尝试添加.datatable.aware=TRUE
,但这似乎没有做任何事情。