簡體   English   中英

僅在R包中需要時才加載包

[英]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中的xy函數。
  • 在代碼中使用雙冒號運算符: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM