我正在编写一个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命令吗?
答案 0 :(得分:2)
通过将import(data.table)包含到我自己的包的名称空间中解决了该问题。现在感觉很愚蠢。