R:仅在使用新包中的data.tables时加载才会在键控子集上产生错误

时间:2019-05-17 12:03:17

标签: r data.table package

我正在编写一个R包,其中使用了一些data.table功能(特别是键和基于键的子集)。我在某处读到为了写一个“好的”程序包,我需要确保只需要加载data.table而不是将其附加。因此,在编写代码时,我确保没有附加data.table,而是使用data.table::命令将函数调用定向到data.table命名空间。一个例子是:

ExampleFunction<-function(){
  set.seed(2)
  DT<-data.table::data.table(a=sample(letters[1:5],20,T),b=sample(1:2,20,T),c=1:20)
  data.table::setkeyv(DT,c("a","b"))
  return(DT[list("a",2),])
}

请注意,返回行使用的命令仅适用于data.tables,但我无法以标准方式指定data.table命名空间(因为那样会在data.table命名空间中搜索DT)。无论如何,从控制台运行此功能(不附加data.table)都会得到预期的输出:

> ExampleFunction()
   a b  c
1: a 2  1
2: a 2 14

但是,当我构建包(使用描述中列出的data.table作为导入而不是依赖项)并运行相同的函数时,出现以下错误:

> ExampleFunction()
Error in xj[i] : invalid subscript type 'list' 

具有以下追溯:

4. `[.data.frame`(x, i, j) 
3. `[.data.table`(DT, list("a", 2), ) at Examples.R#5
2. DT[list("a", 2), ] at Examples.R#5
1. ExampleFunction() 

回溯表明此错误发生在函数的返回行中,这意味着它不再将其识别为data.table命令。我的问题是,如果在包装之外可以使用,为什么在包装内会出错?我的软件包需要依赖于data.table而不是仅仅导入它吗?最后还有一种方法可以指定DT[list("a",2),]是data.table命令吗?

1 个答案:

答案 0 :(得分:2)

通过将import(data.table)包含到我自己的包的名称空间中解决了该问题。现在感觉很愚蠢。