在另一台机器上运行我的R程序时,我有一种奇怪的行为。
当我尝试运行data.table join df1[df2]
时,我收到错误消息
`[.default`(x,i)中的错误:无效的下标类型'列表'
我认为由于某种原因,另一台机器上的R环境找不到data.table括号函数(虽然我已经在那里加载了库)。
要强制R使用data.table中的括号我想明确调用括号函数,但我无法知道如何。
我在这里尝试了
library(data.table)
df1 <- data.frame(a = c("a1","a2","a3"), n = c(1,2,3), b = c(T,T,T))
df2 <- data.frame(a = c("a1","a2","a3"), n = c(1,2,3), b = c(F,T,F))
df1 <- data.table(df1)
df2 <- data.table(df2)
setkey(df1,a,n,b)
setkey(df2,a,n,b)
df1[df2] # produces `[.default`(x, i) : invalid subscript type 'list'
# my tries to call `[.data.table` explicitly all produce errors
`[.data.table`(df1, df2)
data.table::`[.data.table`(df1, df2)
data.table::`[`(df1, df2)
如何显式使用data.table包中的括号函数?
修改
好的,我正试图找出错误的根本原因。 我使用R版本3.2.1,
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.2 mypackage_1.0 ROracle_1.1-10 DBI_0.2-7
loaded via a namespace (and not attached):
[1] plyr_1.8.1 reshape2_1.4 Rcpp_0.11.2 stringr_0.6.2
在调用is.data.table
之前, TRUE
在df1和df2上都给出df1[df2]
(我通过代码进行调试)。
包含代码行df1[df2]
的函数在mypackage_1.0(我正在开发的软件包)中调用。我注意到,如果我逐行运行代码,而不是调用我的包函数并调试它,代码按预期工作。所以我认为包装有问题。在DESCRIPTION文件中,我只导入&#34;建议&#34;下的包data.table。可能与此有关吗?
答案 0 :(得分:3)
渴望发表评论,以便发帖回答 与您的案件有关的一般性评论。
[.data.table
运算符调用未导出的data.table函数,显式调用:::
。
data.table:::`[.data.table`(x, i)
使用:::
不是最佳做法,因为它使您负责包作者决定不直接向用户公开的函数。您应该记住这一点,R CMD check
仍然不会引发错误或警告。根据{{3}}:
使用
foo:::f
代替foo::f
可以访问未导出的对象。通常不建议这样做,因为包装作者在日常维护中可能会更改未导出对象的语义。
在我看来,如果您开发和内部包将使用明确声明的依赖项版本进行部署,则使用:::
是非常安全的。
if(is.data.table(df1) && is.data.table(df2)) df1[df2] else stop("not a data.table")
sessionInfo()
作为调试跨程序包问题的第一步,以跟踪附加的软件包。