我正在编写一个与其他软件包有多个依赖关系的R软件包,其中一些软件包在CRAN中可用,而其他软件包则是自制的。
根据帮助,library("my_package")
将在我之前安装它时加载包的名称空间,即install.package("my_package")
。
然而,一旦我安装了软件包,我就可以通过my_package::my_function()
使用已安装但未加载的软件包的所有功能,所以如果我的软件包有依赖项,那么除了将它们添加到DESCRIPTION
文件中:
Imports:
dplyr,
my_package2,
ggvis,
在包文件夹的根目录中。
我是否必须通过library()
加载新软件包的依赖项,否则最终用户如果未在其计算机上安装,则会看到错误,因为 Imports 部分中指定了所需的软件包?
答案 0 :(得分:6)
不,用户不必加载my_package
中函数使用的包。
您在Imports:
文件中列出DESCRIPTION
下的软件包这一事实意味着在安装my_package
期间,R将检查您的系统上是否有此软件包。这意味着my_package
中的函数可以使用::
符号来使用这些包中的函数,如您所建议的那样。
使用::
表示法是从其他包引用函数的推荐方法,但还有其他选项:
为了使dplyr
中的::
无my_package
import(dplyr)
可以访问所有功能,您可以将NAMESPACE
添加到select
文件。如果您使用包中的许多功能,这很方便。
如果您打算仅使用dplyr
中的importFrom(select, dplyr)
功能,则可以将NAMESPACE
添加到DESCRIPTION
文件中。
您还可以将包添加到Depends:
下的library(my_package)
文件中。这意味着当您使用my_package
时,包将加载到全局环境中。这几乎不是一个好的解决方案。
依赖关系的一般概念是R select()
将拥有"它自己的版本"它依赖于加载的包。因此,您可以随时确保使用dplyr
包中的Depends:
功能,如您所愿。使用绕过此系统的my_package
是个例外。在这种情况下,select()
将在全局环境中查找函数,如果有人在全局环境中定义了一个名为my_package
的函数,DESCRIPTION
将使用此函数,您将获得意外结果
示例1:
Imports:
dpylr
档案:
my_package
来自my_fun <- function(...) {
dplyr::mutate(...) %>%
dplyr::select(1:3)
}
的一些功能:
DESCRIPTION
示例2:
Imports:
dpylr
档案:
NAMESPACE
import(dplyr)
档案:
my_package
来自my_fun <- function(...) {
mutate(...) %>%
select(1:3)
}
的一些功能:
DESCRIPTION
示例3:
Imports:
dpylr
档案:
NAMESPACE
importFrom(select, dplyr)
档案:
my_package
来自my_fun <- function(...) {
dpylr::mutate(...) %>%
select(1:3)
}
的一些功能:
{{1}}
您可以找到有关如何在Web上处理R包中的依赖关系的更详细说明。例如,以下内容非常有用: