Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R导出函数中的数据表中断_R_Data.table_Devtools - Fatal编程技术网

R导出函数中的数据表中断

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以在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()

> 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))