为什么我的非交互式R会话可以调度data.table,就像它是data.frame一样?

时间:2014-01-23 21:45:45

标签: r dataframe data.table

我有一个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。有什么想法吗?

2 个答案:

答案 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