【发布时间】:2014-06-08 18:06:26
【问题描述】:
我在让 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
怎么了?
更新
感谢@GSee 的帮助。看起来这实际上是一个 devtools 问题。查看下面的交互式命令行代码。
加载 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
运行 load_all() 会破坏 foo:
> load_all()
Loading test_package
> foo()
[1] TRUE
Error in `[.data.frame`(x, i, j) : object 'c1' not found
不知何故 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:
> 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,但这似乎没有任何作用。
【问题讨论】:
-
你确定你的包中的
foo是完全一样的(即你没有漏掉x[和col3之间的逗号吗? -
它们是一样的。我将文件 foo.R(如上所示)中的函数复制并粘贴到 R 命令行中。
-
在命令行中检查
yourpackagename::foo以确保它们确实相同。仅仅因为您在编辑器上看到的文件看起来像 X 并不意味着在您的 R 会话中加载的包中的函数是相同的。 -
如果您构建和加载包,或者仅当您使用
load_all()时,您是否有此问题? -
尝试将
.datatable.aware=TRUE放在R 文件中的一行,看看load_all()是否有效。我认为这个LINK 可能是相关的——更新devtools可能会解决问题。
标签: r data.table devtools