2012-03-01 22 views
27

我正在開發的R包需要多個R數據對象,例如預先計算的模型和參數。你如何處理包內部的R數據?

目前,我在每個.RData文件的包的'data'目錄中有每個對象。使用軟件包時,用戶可以使用「數據」功能將這些對象附加到其環境中。

我想要的反而是加載包時數據對象會自動附加到內部包環境,而不能直接由用戶訪問。

我的理解是,將'sysdata.rda'文件放在包含當前'data'對象的包的'R'目錄中會給我想要的結果。但是,有沒有辦法做到這一點,以便我可以讓每個對象在一個單獨的文件,而不是分組在一起?

+0

爲什麼把每個對象放在一個單獨的文件中,爲什麼不分別引用每個對象呢?例如'packagename ::: a'和'packagename ::: b'。 – 2017-10-05 19:25:16

+0

@the_skua單獨的文件對於包中的文件版本管理更簡單有用。這是前一陣子,但我認爲我有不同的模型適合作爲包的一部分,有時我們想更新其中的一個,但不是全部。 – Nixuz 2017-10-06 00:02:00

回答

9

加載軟件包時,可以使用.onLoad()鉤子調用data(),並指定軟件包名稱空間作爲加載數據對象的環境。

假設你有文件在data/目錄你的包稱爲foopkgmodel1.Rmydata.RData,在你的包中定義的函數

.onLoad <- function(libname, pkgname) { 
    data("model1", "mydata", package=pkgname, envir=parent.env(environment())) 
} 

地方(例如,在foopkg-package.R)。

建設和安裝包後,

> library(foopkg) 
> ls(loadNamespace("foopkg")) 

應證明各種數據對象已成功加載到包的命名空間,即以功能可見在你的包,但不污染地球環境。

12

將您的sysdata.rda文件放入您包裝的data目錄中。

不要使用惰性數據 - 你的描述的文件應不會有 LazyData線,或者,如果這樣做,應該是LazyData: no

在任何.R文件在你的包中的R目錄加上這樣一行

data(sysdata, envir=environment()) 

我創建了一個名爲data.framesysdata其保存到一個名爲包的數據目錄中稱爲 sysdata.rda文件anRpackage

我將上面的行添加到.R文件,並且還添加了這個未導出的函數 只是爲了顯示包中的函數可以訪問數據。

foo <- function() tail(sysdata, 2) 

然後我看到R對話

> library(anRpackage) 
> sysdata 
Error: object 'sysdata' not found 

> anRpackage:::sysdata 
    A B C 
1 1 6 a 
2 2 7 b 
3 3 8 c 
4 4 9 d 
5 5 10 e 

> anRpackage:::foo() 
    A B C 
4 4 9 d 
5 5 10 e 

因此,用戶仍然可以訪問的數據可以,但你的要求,他們沒有直接訪問。用戶仍然可以選擇運行data(sysdata)

+3

此回覆不回答問題。我在詢問如何將數據分成不同的文件,而不是數據可訪問性範圍。 – Nixuz 2012-09-08 19:10:10

+1

你說你目前在數據目錄中有很多數據文件。因此,爲每個數據文件添加一行,如'data(sysdata,envir = environment())',以便它們「自動附加到內部軟件包環境並且不能直接被用戶訪問」。請澄清你想要的。 – GSee 2012-09-08 19:29:09