我有一个data.table
对象,我想在其上进行简单的查找:
print(class(dt))
print(colnames(dt))
print(dt[region == "UK", ])
在我的交互式R会话中,这段代码完全符合它的要求。
[1] "data.table" "data.frame"
[1] "region" "site" "visit"
[4] "connectionfailure" "dnserror" "http404"
# ... output ...
在非交互式脚本会话中,我遇到了一个令人困惑的错误:
[1] "data.table" "data.frame"
[1] "region" "site" "visit"
[4] "connectionfailure" "dnserror" "http404"
Error in `[.data.frame`(x, i, j) : object 'region' not found
看起来R正在向[.data.frame发送dt[....
而不是[.data.table。有什么想法吗?
答案 0 :(得分:5)
您很可能没有在批量执行中设置library(data.table)
。可能是基于您的用户配置文件自动加载data.table
,但不是批处理exec。另外,只是b / c有一个类data.table
,并不意味着包已加载:
library(data.table)
dt <- data.table(a=1:3)
detach("package:data.table", unload=TRUE)
class(dt)
# [1] "data.table" "data.frame"
setkey(dt, a)
# Error: could not find function "setkey"
library(data.table)
setkey(dt, a)
#works
答案 1 :(得分:3)
后代:在批量执行中,有问题的代码是从自定义包加载的。我忽略了在我的包NAMESPACE
文件中包含import(data.table)
。我可能是错的,但我认为如果data.table
未包含[.data.table
调用环境在其命名空间中包含data.table
的{{3}},那么这仍然有效,即{ {1}}可能过度了。不过,我确信必须有充分的理由进行这项检查。
编辑:有关此明确检查的更多信息:
explicit check