我有一个包含大量杂项功能的包(参见What to do with imperfect-but-useful functions?)。因为这些功能并不是特别相关,所以它们依赖于一大堆其他包。通常在整个包中只有一个函数使用另一个包。然而,如果我在DESCRIPTION文件中使用Imports,Suggests或Depends,每次加载包时都会加载整个包列表,即使任何给定用户只需要很少的包。
有没有办法只在使用特定函数时才加载依赖项?我可以在函数内部调用library()
,但这似乎是不好的做法,因为它没有告诉软件包管理系统什么,因此用户可能没有安装它。
答案 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)
表示应导入包foo中的函数x
和y
。foo::bar
从包bar
导入函数foo
。例如。 plyr::ddply(...)
将在不加载包的情况下访问ddply函数foo:::bar
),则为在所有三种情况下,应在Imports中提及包。另请参阅相关章节1.6和Writing R Extensions中的其他内容。
编辑:正如@Gavin指出的那样,这一切只有在从具有自己的命名空间的包中导入时才会起作用。从下一版本的R on(2.14?)开始,所有软件包都应该有一个命名空间。