如何自动将函数加载到 R 包的命名空间中
How to automatically load functions into namespace of an R package
我有一个 R 包,它要求来自其他几个包的函数位于命名空间中。使用 roxygen2 文档,我已经成功 安装 这些包(即 install.packages(dplyr)
),但我无法自动加载它们(即 library(dplyr)
)。
这是我的描述文件:
Package: pkgname
Title: What the Package Does (one line, title case)
Version: 0.0.0.9000
Authors@R: person("First", "Last", email = "email@example.com", role = c("aut", "cre"))
Description: What the package does (one paragraph).
Depends: R (>= 3.5.2)
Imports:
ggplot2,
zoo,
tidyr,
dplyr,
magrittr
Suggests:
RColorBrewer
License: What license is it under?
Encoding: UTF-8
LazyData: true
RoxygenNote: 6.1.1
在我的一个需要来自 magrittr 的管道函数的函数的文档末尾,我包含了以下符号:
#' @importFrom magrittr %>%
#'
#' @export
funName <- function(...) {
...
}
和另一个函数:
#' @import ggplot2
#' @importFrom magrittr %>%
#'
#' @export
funName2 <- function(...) {
...
}
这成功地显示在我的 NAMESPACE 文件中:
# Generated by roxygen2: do not edit by hand
export(funName2)
export(funName)
import(ggplot2)
importFrom(magrittr,"%>%")
然而,尽管在 roxygen2 注释中添加了符号并且在我的 NAMESPACE 文件中添加了正确的脚本,但我仍然必须在每个新文件中使用 library(package-name)
加载包 ggplot2
和 magrittr
R会话。我希望 dplyr
、tidyr
和 zoo
有此要求(因为我没有明确加载这些,只是安装它们),但我没有 ggplot2
或 %>%
运算符。我是否错误地导入了它们?
你永远不应该在你的包函数中使用 library(package.name)
。而是使用 package.name::function.name()
。
您需要重新导出 magrittr
管道运算符:
1- 将 magrittr
放入 DESCRIPTION 文件(就像您所做的那样)
2- 使用以下行在包 R/
目录中创建一个 __imports.R
文件:
#' re-export magrittr pipe operator
#'
#' @importFrom magrittr %>%
#' @name %>%
#' @rdname pipe
#' @export
NULL
或者,类似地做 Hadley Wickham says:
#' Pipe operator
#'
#' @name %>%
#' @rdname pipe
#' @keywords internal
#' @export
#' @importFrom magrittr %>%
#' @usage lhs \%>\% rhs
NULL
我认为您可以在必要时对其他导入执行相同的操作。能用多少就用@importFrom
,否则重新导出。
尝试 运行 以下命令将您的包放入 NAMESPACE
devtools::document()
在 运行 之后,所有导入的 (@import) 包都将被插入到 NAMESPACE 中。
希望对您有所帮助 ;)
我有一个 R 包,它要求来自其他几个包的函数位于命名空间中。使用 roxygen2 文档,我已经成功 安装 这些包(即 install.packages(dplyr)
),但我无法自动加载它们(即 library(dplyr)
)。
这是我的描述文件:
Package: pkgname
Title: What the Package Does (one line, title case)
Version: 0.0.0.9000
Authors@R: person("First", "Last", email = "email@example.com", role = c("aut", "cre"))
Description: What the package does (one paragraph).
Depends: R (>= 3.5.2)
Imports:
ggplot2,
zoo,
tidyr,
dplyr,
magrittr
Suggests:
RColorBrewer
License: What license is it under?
Encoding: UTF-8
LazyData: true
RoxygenNote: 6.1.1
在我的一个需要来自 magrittr 的管道函数的函数的文档末尾,我包含了以下符号:
#' @importFrom magrittr %>%
#'
#' @export
funName <- function(...) {
...
}
和另一个函数:
#' @import ggplot2
#' @importFrom magrittr %>%
#'
#' @export
funName2 <- function(...) {
...
}
这成功地显示在我的 NAMESPACE 文件中:
# Generated by roxygen2: do not edit by hand
export(funName2)
export(funName)
import(ggplot2)
importFrom(magrittr,"%>%")
然而,尽管在 roxygen2 注释中添加了符号并且在我的 NAMESPACE 文件中添加了正确的脚本,但我仍然必须在每个新文件中使用 library(package-name)
加载包 ggplot2
和 magrittr
R会话。我希望 dplyr
、tidyr
和 zoo
有此要求(因为我没有明确加载这些,只是安装它们),但我没有 ggplot2
或 %>%
运算符。我是否错误地导入了它们?
你永远不应该在你的包函数中使用 library(package.name)
。而是使用 package.name::function.name()
。
您需要重新导出 magrittr
管道运算符:
1- 将 magrittr
放入 DESCRIPTION 文件(就像您所做的那样)
2- 使用以下行在包 R/
目录中创建一个 __imports.R
文件:
#' re-export magrittr pipe operator
#'
#' @importFrom magrittr %>%
#' @name %>%
#' @rdname pipe
#' @export
NULL
或者,类似地做 Hadley Wickham says:
#' Pipe operator
#'
#' @name %>%
#' @rdname pipe
#' @keywords internal
#' @export
#' @importFrom magrittr %>%
#' @usage lhs \%>\% rhs
NULL
我认为您可以在必要时对其他导入执行相同的操作。能用多少就用@importFrom
,否则重新导出。
尝试 运行 以下命令将您的包放入 NAMESPACE
devtools::document()
在 运行 之后,所有导入的 (@import) 包都将被插入到 NAMESPACE 中。
希望对您有所帮助 ;)