2012-05-10 17 views
56

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

我創建一個函數test.fun,它只是創建一個小的data.table對象,然後用「A」列對「Val」列進行求和。該代碼是

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 

任何人都可以向我解釋這是爲什麼發生,我能做些什麼來解決它。很感謝任何形式的幫助。

+11

我的猜測是您尚未聲明依賴關係。您應該從函數中移除'library(data.table)',並在您的名稱空間和DESCRIPTION中聲明'depends:data.table'。 – Andrie

回答

67

安德里的猜測是正確的,+1。有就可以了FAQ(見vignette("datatable-faq")),以及對進口data.tablevignette

FAQ 6.9:我已經創建依賴於data.table包。我如何 確保我的包是data.table-aware,以便從 繼承data.frame的作品?

或者i)包括在描述文件的Depends:字段data.table,或ii)包括在描述文件的Imports:字段data.table AND import(data.table)在NAMESPACE文件。

而且背景......在[.data.table(和其他data.table功能)的頂部,會根據到cedta()呼叫的結果看到的開關。這表示調用環境數據表格。打字data.table:::cedta顯示它是如何完成的。它依賴於具有名稱空間的調用包,並且該名稱空間導入或取決於data.table。這是data.table如何可以傳遞到非data.table感知包(如base功能)以及這些軟件包可以在data.table用絕對標準[.data.frame語法,一無所知的data.frameis()一個data.table了。

這也是爲什麼data.table繼承沒有使用與無名稱空間包兼容的原因,以及爲什麼根據用戶請求,我們不得不要求這些包的作者在其包中添加名稱空間以兼容。令人高興的是,現在的R增加了對包丟失一個(從v2.14.0)默認命名空間,這個問題已經消失:

變化中的R版本2.14.0
*所有包裝必須有一個命名空間,如果未在源代碼中提供,則會在安裝時創建一個。

+4

+1很好的答案。 – Andrie

+0

(對不起,重振這個,但是...)馬修,你能否從交互的角度澄清這將如何工作?如果我的包在交互式會話中向用戶返回'data.table',他們是否需要使用'data.table'語義,或者有什麼方法可以支持熟悉的'data.frame'語法? –

+1

@JeffAllen這是一個新的...不確定。如果你的包依賴於data.table,那麼會讓用戶data.table知道我猜。也許導入data.table不會(也許這就是你想要的)。 –

14

下面是完整的配方:

1)添加到data.tableImportsDESCRIPTION文件。

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

+2

'@import data.table'命令特別有用 – mbarete

相關問題