仅在R包中需要时加载包

仅在R包中需要时加载包,r,package,R,Package,我有一个包,其中包含了一大堆杂项函数(请参阅)。因为这些函数并不是特别相关,所以它们依赖于一大堆其他的包。通常,整个包中只有一个函数使用另一个包。但是,如果我在描述文件中使用导入、建议或依赖,则每次加载包时都会加载整个包列表,即使任何给定用户都不需要它们 有没有办法只在使用特定函数时加载依赖项?我可以在函数本身内部调用library(),但这似乎是一种糟糕的做法,因为它不会告诉包管理系统任何事情,因此用户可能没有安装它。您可以使用建议,在需要包的函数中,您可以向require()添加代码所述软件

我有一个包,其中包含了一大堆杂项函数(请参阅)。因为这些函数并不是特别相关,所以它们依赖于一大堆其他的包。通常,整个包中只有一个函数使用另一个包。但是,如果我在描述文件中使用导入、建议或依赖,则每次加载包时都会加载整个包列表,即使任何给定用户都不需要它们


有没有办法只在使用特定函数时加载依赖项?我可以在函数本身内部调用
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
    从包
    foo
    导入函数
    bar
    。例如,
    plyr::ddply(…)
    将在不加载包的情况下访问ddply函数
  • 如果对象未导出(
    foo:::bar
    ),则使用三重冒号运算符
在所有这三种情况下,包装都应在进口中提及。另请参见中的相关第1.6章和其他章节


EDIT:正如@Gavin所指出的,只有当从具有自己名称空间的包导入时,这一切才起作用。从R的下一个版本(2.14?)开始,所有包都应该有一个名称空间。

这正是我想要的。谢谢。+1此策略可能适用于杂项软件包:
Suggest
ed软件包无需安装即可安装您的软件包。对于杂项包,这可能是一个很大的优势。例如,用户可以使用vegan的非rgl部分,即使rgl不能安装在其机器上。在这种情况下,只有使用rgl的函数不可用。@cbeleites这正是Jari Oksanen(素食主义开发负责人)选择对我们使用的额外软件包使用建议的原因。与
require
相比,您可能需要使用
requireNamespace
。有关更多详细信息,请参阅。+1确实假定软件包有名称空间-许多现在没有,但从R的下一个主要版本开始,所有软件包都将有名称空间。另请参阅此处的讨论。请注意,
Imports:
中列出的所有软件包必须在用户系统上可用,才能安装软件包。请参阅我对加文解决方案的评论。