[英]Load a package only when needed in R package
我有一個包含一堆雜項功能的軟件包(請參閱如何處理不完善但有用的功能? )。 由於功能不是特別相關,因此它們依賴於許多其他軟件包。 通常,整個程序包中只有一個功能使用另一個程序包。 但是,如果我在Description文件中使用Imports,Suggests或Depends,則每次加載軟件包時都會加載整個軟件包列表,即使任何給定用戶幾乎不需要這些軟件包。
有什么方法可以僅在使用特定功能時才加載依賴項嗎? 我可以在函數本身內部調用library()
,但這似乎是一種不好的做法,因為它沒有告訴包管理系統任何信息,因此用戶可能沒有安裝它。
您可以使用“建議”,並在需要該程序包的函數中向“ require()
表示的程序包添加代碼,如果不可用,則會引發錯誤。 我熟悉的一個例子,素食主義者的包裝,在其描述中
Depends: permute
Suggests: MASS, mgcv, lattice, cluster, scatterplot3d, rgl, tcltk
在加載包時,我們有:
R> require(vegan)
Loading required package: vegan
Loading required package: permute
This is vegan 1.90-0
和sessionInfo()
報告沒有建議的軟件包尚未加載/附加,例如:
R> sessionInfo()
R version 2.13.1 Patched (2011-07-29 r56550)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_GB.utf8 LC_NUMERIC=C
[3] LC_TIME=en_GB.utf8 LC_COLLATE=en_GB.utf8
[5] LC_MONETARY=C LC_MESSAGES=en_GB.utf8
[7] LC_PAPER=en_GB.utf8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] vegan_1.90-0 permute_0.5-0
loaded via a namespace (and not attached):
[1] tools_2.13.1
通常,我盡量避免在軟件包中使用require()
。 作為建議,使用命名空間(這並不困難)並使用Imports
:此處提到的包未加載。 您可以通過以下方式從另一個包中僅導入一個函數:
importFrom
聲明。 importFrom(foo, x, y)
告訴應該導入軟件包foo中的x
和y
函數。 foo::bar
bar
從包foo
導入函數bar
。 例如。 plyr::ddply(...)
將在不加載軟件包的情況下訪問ddply函數 foo:::bar
) 在這三種情況下,均應在“導入”中提及這些軟件包。 另請參閱相關章節1.6和“ 編寫R擴展”中的其他章節。
編輯:正如@Gavin指出的那樣,這僅在從具有自己的命名空間的包中導入時才有效。 從R的下一版本(2.14?)開始,所有軟件包都應具有名稱空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.