我正在開發的R包需要多個R數據對象,例如預先計算的模型和參數。你如何處理包內部的R數據?
目前,我在每個.RData文件的包的'data'目錄中有每個對象。使用軟件包時,用戶可以使用「數據」功能將這些對象附加到其環境中。
我想要的反而是加載包時數據對象會自動附加到內部包環境,而不能直接由用戶訪問。
我的理解是,將'sysdata.rda'文件放在包含當前'data'對象的包的'R'目錄中會給我想要的結果。但是,有沒有辦法做到這一點,以便我可以讓每個對象在一個單獨的文件,而不是分組在一起?
我正在開發的R包需要多個R數據對象,例如預先計算的模型和參數。你如何處理包內部的R數據?
目前,我在每個.RData文件的包的'data'目錄中有每個對象。使用軟件包時,用戶可以使用「數據」功能將這些對象附加到其環境中。
我想要的反而是加載包時數據對象會自動附加到內部包環境,而不能直接由用戶訪問。
我的理解是,將'sysdata.rda'文件放在包含當前'data'對象的包的'R'目錄中會給我想要的結果。但是,有沒有辦法做到這一點,以便我可以讓每個對象在一個單獨的文件,而不是分組在一起?
加載軟件包時,可以使用.onLoad()
鉤子調用data()
,並指定軟件包名稱空間作爲加載數據對象的環境。
假設你有文件在data/
目錄你的包稱爲foopkg
model1.R
和mydata.RData
,在你的包中定義的函數
.onLoad <- function(libname, pkgname) {
data("model1", "mydata", package=pkgname, envir=parent.env(environment()))
}
地方(例如,在foopkg-package.R
)。
建設和安裝包後,
> library(foopkg)
> ls(loadNamespace("foopkg"))
應證明各種數據對象已成功加載到包的命名空間,即以功能可見在你的包,但不污染地球環境。
將您的sysdata.rda
文件放入您包裝的data
目錄中。
不要使用惰性數據 - 你的描述的文件應不會有 LazyData線,或者,如果這樣做,應該是LazyData: no
在任何.R文件在你的包中的R目錄加上這樣一行
data(sysdata, envir=environment())
我創建了一個名爲data.frame
和sysdata
其保存到一個名爲包的數據目錄中稱爲 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)
。
爲什麼把每個對象放在一個單獨的文件中,爲什麼不分別引用每個對象呢?例如'packagename ::: a'和'packagename ::: b'。 – 2017-10-05 19:25:16
@the_skua單獨的文件對於包中的文件版本管理更簡單有用。這是前一陣子,但我認爲我有不同的模型適合作爲包的一部分,有時我們想更新其中的一個,但不是全部。 – Nixuz 2017-10-06 00:02:00