R导出函数中的数据表中断
我在获取data.table以在roxygen2导出函数中工作时遇到问题 下面是一个名为foo.R(位于我的包的R目录中)的文件中的一个简单的伪函数,它使用data.table:R导出函数中的数据表中断,r,data.table,devtools,R,Data.table,Devtools,我在获取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)] } 运行load_all() > l
#' Data.table test function
#' @export
foo <- function() {
m <- data.table(c1 = c(1,2,3))
print(is.data.table(m))
m[,sum(c1)]
}
运行load_all()
> 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
此外,我更新到devtools 1.5并尝试添加.datatable.aware=TRUE
,但这似乎没有任何作用。正如@GSee指出的(在评论中)问题似乎仍然存在
为了确定包是否支持data.table,data.table
调用函数cedta()
,即:
> data.table:::cedta
function (n = 2L)
{
te = topenv(parent.frame(n))
if (!isNamespace(te))
return(TRUE)
nsname = getNamespaceName(te)
ans = nsname == "data.table" || "data.table" %chin% names(getNamespaceImports(te)) ||
"data.table" %chin% tryCatch(get(".Depends", paste("package",
nsname, sep = ":"), inherits = FALSE), error = function(e) NULL) ||
(nsname == "utils" && exists("debugger.look", parent.frame(n +
1L))) || nsname %chin% cedta.override || identical(TRUE,
tryCatch(get(".datatable.aware", asNamespace(nsname),
inherits = FALSE), error = function(e) NULL))
if (!ans && getOption("datatable.verbose"))
cat("cedta decided '", nsname, "' wasn't data.table aware\n",
sep = "")
ans
}
<bytecode: 0x7ff67b9ca190>
<environment: namespace:data.table>
当程序包依赖于data.table
时,上述命令应返回TRUE
——也就是说,如果您通过R CMD INSTALL
安装程序包,然后加载程序包。这是因为,在加载包时,默认情况下,R也会在名称空间中创建一个“.Depends”变量。如果您这样做了:
ls("package:test", all=TRUE)
# [1] ".Depends" "foo"
但是,当您执行devtools:::load_all()
时,似乎没有设置此变量
# new session + set path to package's dir
devtools:::load_all()
ls("package:test", all=TRUE)
# [1] "foo"
因此,cedta()
无法知道此包确实依赖于data.table
。但是,当您手动设置.datatable.aware=TRUE
时,行:
identical(TRUE, get(".datatable.aware", asNamespace(nsname), inherits = FALSE))
执行,它将返回TRUE,因此克服了该问题。但是,devtools
没有将.dependens
变量放在包的名称空间中的事实仍然存在
总而言之,数据确实没有问题。table
您确定包中的foo
是完全相同的(即,x[
和col3
之间没有省略逗号?它们是相同的。我从文件foo.R中复制并粘贴了函数(如上所示)进入R命令行。检查命令行上的yourpackagename::foo
,确保它们确实是相同的。仅仅因为编辑器上看到的文件看起来像X,并不意味着在R会话中加载的包中的函数是相同的。如果生成并加载包,或者仅当您重新使用load_all()
?尝试将.datatable.aware=TRUE
放在一个R文件中的一行上,看看load_all()
是否有效。我想这可能与此相关——更新devtools
可以解决问题。
> data.table:::cedta
function (n = 2L)
{
te = topenv(parent.frame(n))
if (!isNamespace(te))
return(TRUE)
nsname = getNamespaceName(te)
ans = nsname == "data.table" || "data.table" %chin% names(getNamespaceImports(te)) ||
"data.table" %chin% tryCatch(get(".Depends", paste("package",
nsname, sep = ":"), inherits = FALSE), error = function(e) NULL) ||
(nsname == "utils" && exists("debugger.look", parent.frame(n +
1L))) || nsname %chin% cedta.override || identical(TRUE,
tryCatch(get(".datatable.aware", asNamespace(nsname),
inherits = FALSE), error = function(e) NULL))
if (!ans && getOption("datatable.verbose"))
cat("cedta decided '", nsname, "' wasn't data.table aware\n",
sep = "")
ans
}
<bytecode: 0x7ff67b9ca190>
<environment: namespace:data.table>
"data.table" %chin% get(".Depends", paste("package", nsname, sep=":"), inherits=FALSE)
ls("package:test", all=TRUE)
# [1] ".Depends" "foo"
# new session + set path to package's dir
devtools:::load_all()
ls("package:test", all=TRUE)
# [1] "foo"
identical(TRUE, get(".datatable.aware", asNamespace(nsname), inherits = FALSE))