明确地调用`[.data.table`

时间:2016-01-12 11:13:06

标签: r data.table

在另一台机器上运行我的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。可能与此有关吗?

1 个答案:

答案 0 :(得分:3)

渴望发表评论,以便发帖回答 与您的案件有关的一般性评论。

  1. 您可以使用[.data.table运算符调用未导出的data.table函数,显式调用:::
  2. data.table:::`[.data.table`(x, i)
    

    使用:::不是最佳做法,因为它使您负责包作者决定不直接向用户公开的函数。您应该记住这一点,R CMD check仍然不会引发错误或警告。根据{{​​3}}:

      

    使用foo:::f代替foo::f可以访问未导出的对象。通常不建议这样做,因为包装作者在日常维护中可能会更改未导出对象的语义。

    在我看来,如果您开发和内部包将使用明确声明的依赖项版本进行部署,则使用:::是非常安全的。

    1. 更新您的data.table版本,1.9.2已经是旧版本了。
    2. 在您的DESCRIPTION文件中使用 Imports data.table并且不要忘记在NAMESPACE文件中定义导入
    3. 使用以下
    4. 调试有问题的计算机

      if(is.data.table(df1) && is.data.table(df2)) df1[df2] else stop("not a data.table")
      
      1. 使用sessionInfo()作为调试跨程序包问题的第一步,以跟踪附加的软件包。