在我自己的包中使用data.table包

rus*_*ser 73 r data.table

我试图在我自己的包中使用data.table包.MWE如下:

我创建了一个函数test.fun,它只是创建一个小的data.table对象,然后将"Val"列分组为"A"列.代码是

test.fun<-function ()
{
    library(data.table)
    testdata<-data.table(A=rep(seq(1,5), 5), Val=rnorm(25))
    setkey(testdata, A)
    res<-testdata[,{list(Ct=length(Val),Total=sum(Val),Avg=mean(Val))},"A"]
    return(res)
}
Run Code Online (Sandbox Code Playgroud)

当我在常规R会话中创建此函数,然后运行该函数时,它按预期工作.

> res<-test.fun()
data.table 1.8.0  For help type: help("data.table")
> res
     A Ct      Total        Avg
[1,] 1  5 -0.5326444 -0.1065289
[2,] 2  5 -4.0832062 -0.8166412
[3,] 3  5  0.9458251  0.1891650
[4,] 4  5  2.0474791  0.4094958
[5,] 5  5  2.3609443  0.4721889
Run Code Online (Sandbox Code Playgroud)

当我将此函数放入包中时,安装包,加载包,然后运行该函数,我收到一条错误消息.

> library(testpackage)
> res<-test.fun()
data.table 1.8.0  For help type: help("data.table")
Error in `[.data.frame`(x, i, j) : object 'Val' not found
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么会发生这种情况以及我可以做些什么来解决它.很感谢任何形式的帮助.

Mat*_*wle 87

安德丽的猜测是正确的,+ 1.它上面有一个FAQ(参见参考资料vignette("datatable-faq")),以及一个关于导入的新小插图data.table:

FAQ 6.9:我创建了一个依赖于data.table的包.如何确保我的包是data.table-aware,以便从data.frame继承?

要么i)包含data.tableDepends:DESCRIPTION文件的字段中,要么ii)包含data.tableImports:DESCRIPTION文件的字段中和import(data.table)NAMESPACE文件中.

进一步的背景...在[.data.table(和其他data.table功能)的顶部,你会看到一个开关取决于调用的结果cedta().这代表呼叫环境数据表感知.打字data.table:::cedta显示它是如何完成的.它依赖于具有命名空间的调用包,以及该命名空间Import'ing或Depend'ing on data.table.这是如何data.table传递给非data.table-aware包(例如函数base)和那些包可以使用绝对标准的[.data.frame语法data.table,幸福地不知道data.frame is()a data.table.

这也是data.table继承不习惯与无命名空间包兼容的原因,以及为什么在用户请求时我们不得不要求这些包的作者在其包中添加一个名称空间以便兼容.令人高兴的是,现在R为缺少一个(从v2.14.0开始)的软件包添加了一个默认命名空间,这个问题已经消失了:

更改版本2.14.0
*所有软件包都必须具有命名空间,如果源中未提供,则会在安装时创建一个.

  • @OskarHansson很高兴取决于作品,但只要你在NAMESPACE中同时导入描述*和*`import(data.table)`,导入就应该有效吗? (4认同)
  • @MattDowle你是对的.我在使用Depends时得到了一个注释.我改回了Imports +在代码中添加了`@import data.table`,因此Roxygen在NAMESPACE中添加了`import(data.table)`. (3认同)

war*_*hip 25

这是完整的食谱:

1)添加data.tableImports您的DESCRIPTION文件中.

2)添加@import data.table到各自的.R文件(即包含抛出错误的函数的.R文件Error in [.data.frame(x, i, j) : object 'Val' not found).

3)键入library(devtools)并设置工作目录以指向R包的主目录.

4)类型document().这将确保您的NAMESPACE文件包含import(data.table)一行.

5)类型 build()

6)类型 install()

有关什么build()install()做的一个很好的入门,请参阅:http://kbroman.org/pkg_primer/.

然后,一旦你关闭你的R会话并下次登录,你可以立即直接进入:

1)类型 library("my_R_package")

2)键入上面提到的.R文件中的函数名称.

3)享受!你不应再收到可怕的了Error in [.data.frame(x, i, j) : object 'Val' not found

  • `@import data.table`命令特别有用 (3认同)
  • 这次真是万分感谢。您帮助我以易于阅读的格式了解了该做什么。 (2认同)