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

时间:2012-05-10 03:18:29

标签: 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)
}

当我在常规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

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

> 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

任何人都可以向我解释为什么会发生这种情况以及我可以采取哪些措施来解决这个问题。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:83)

Andrie猜测是对的,+ 1。有关于它的常见问题解答(请参阅vignette("datatable-faq")),以及导入data.table的新vignette

  

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

     

i)在描述文件的data.table字段中包含Depends:,或ii)在描述文件的data.table字段中包含Imports:并{{1在你的NAMESPACE文件中。

更多背景...在import(data.table)(和其他[.data.table个功能)的顶部,您会看到一个切换,具体取决于对data.table的调用结果。这代表呼叫环境数据表感知。键入cedta()会显示它是如何完成的。它依赖于具有命名空间的调用包,以及data.table:::cedta上的命名空间Import'ing或Depend'ing。这就是data.table可以传递给非 data.table-aware 包(例如data.table中的函数)的方式,这些包可以使用绝对标准的base [.data.frame上的语法,幸福地不知道data.table data.frameis()

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

  

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

答案 1 :(得分:21)

以下是完整的食谱:

1)在data.table文件中将Imports添加到DESCRIPTION

2)将@import data.table添加到您的相应.R文件(即包含导致错误Error in [.data.frame(x, i, j) : object 'Val' not found的函数的.R文件中)。

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