仅在R包中需要时加载包

时间:2011-08-01 08:25:48

标签: r package

我有一个包含大量杂项功能的包(参见What to do with imperfect-but-useful functions?)。因为这些功能并不是特别相关,所以它们依赖于一大堆其他包。通常在整个包中只有一个函数使用另一个包。然而,如果我在DESCRIPTION文件中使用Imports,Suggests或Depends,每次加载包时都会加载整个包列表,即使任何给定用户只需要很少的包。

有没有办法只在使用特定函数时才加载依赖项?我可以在函数内部调用library(),但这似乎是不好的做法,因为它没有告诉软件包管理系统什么,因此用户可能没有安装它。

2 个答案:

答案 0 :(得分:16)

您可以使用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

答案 1 :(得分:15)

一般情况下,我尽量避免在包中使用require()。作为一个建议,使用命名空间(这并不难)并使用Imports:提到的包没有加载。您可以通过以下方式仅从另一个包导入单个函数:

  • 在命名空间文件中使用importFrom声明。 importFrom(foo, x, y)表示应导入包f​​oo中的函数xy
  • 在代码中使用双冒号运算符:foo::bar从包bar导入函数foo。例如。 plyr::ddply(...)将在不加载包的情况下访问ddply函数
  • 如果对象未导出(foo:::bar),则为
  • 或三重冒号运算符

在所有三种情况下,应在Imports中提及包。另请参阅相关章节1.6和Writing R Extensions中的其他内容。

编辑:正如@Gavin指出的那样,这一切只有在从具有自己的命名空间的包中导入时才会起作用。从下一版本的R on(2.14?)开始,所有软件包都应该有一个命名空间。