2011-08-01 68 views
12

我有一大堆雜項功能的包裝(請參閱What to do with imperfect-but-useful functions?)。因爲這些功能並不特別相關,所以它們依賴於大量的其他軟件包。通常在整個包裝中只有一個功能使用另一個包裝。但是,如果我在說明文件中使用Imports,Suggests或Depends,則每次加載包時都會加載整個包列表,即使只有極少數的用戶需要它們。僅在R包中需要時才加載包裝

有沒有什麼辦法只在使用特定函數時才加載依賴關係?我可以在函數內部調用library(),但這似乎是不好的做法,因爲它不告訴包管理系統任何內容,因此用戶可能沒有安裝它。

回答

15

你可以使用Suggests,並且在需要包的函數中你可以添加代碼到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 
+0

這正是我所期待的。謝謝。 –

+4

+1此策略對於misc軟件包來說可能是合適的:'爲了安裝軟件包,不需要安裝'建議'軟件包。對於一個misc包來說,這可能是一個很大的優勢。例如。即使rgl無法安裝在他們的機器上,用戶也可以使用素食的非rgl部分。在這種情況下,只有rgl-using函數不可用。 – cbeleites

+0

@cbeleites這就是Jari Oksanen(主要素食主義者開發人員)選擇使用Suggests來製作我們使用的額外軟件包的原因。 –

14

一般來說,我儘量避免使用require()包。作爲一個建議,使用命名空間(這並不難),並使用Imports:那裏提到的包沒有加載。您可以通過以下方式從另一個包中僅導入單個函數:

  • 使用importFrom聲明在命名空間文件中。 importFrom(foo, x, y)表示應該導入來自軟件包foo的函數xy
  • 在代碼中使用雙冒號操作符:foo::bar從包foo導入函數bar。例如。不帶包被加載
  • 或在對象的情況下,三重結腸操作者不會被導出(foo:::bar

在所有三種情況下,包應在進口提及plyr::ddply(...)將訪問ddply功能。請參閱Writing R Extensions中的相關章節1.6和其他內容。

編輯:正如@Gavin指出的,這一切只適用於從具有自己的命名空間的包顯然導入。從下一版R(2.14?)開始,所有軟件包都應該有一個名稱空間。

+2

+1這確實假定一個軟件包有一個名詞空間 - 很多不是現在,但是所有的都將是R的下一個主要版本。 –

+0

另請參閱此處的討論http://chat.stackoverflow。com/transcript/message/1143070#1143070 –

+0

@Gavin Thx爲了指出這一點。更新了答案。 –