在自写包装中使用马格里特管操作员

我想使用 magrittr包中引入的管道操作符 %>%,这个包是我自己编写的,用于链式 dplyr数据转换。在 DESCRIPTION文件中,magrittr被列为 Import。在加载了我自己的包并测试了使用管道操作符的函数之后,我得到了以下错误消息:

函数名(参数,: 无法找到函数“% >%”中的错误

在函数源代码中将 %>%更改为 magrittr::%>%也没有帮助,因为不能再构建包了。

22885 次浏览

如果你在 Depends中列出了 magrittr,它应该已经正常工作了。但是,这是 不建议。相反,您将 magrittr保留在 Imports中,并在 NAMESPACE中添加以下代码行:

importFrom(magrittr,"%>%")

我建议阅读 写 R 扩展。你的问题在第1.1.3和1.5.1段中有提及。

另一个解决方案是使用 roxygen包。它是作为 devtools包的一部分实现的。一旦安装了 devtools,调用 devtools::document()将为您更新 NAMESPACE。它还能自动生成。带有文档的 RD 文件,这很方便。

您所要做的就是将格式为 #' @import packagename的特殊注释添加到文件中,以便从该包中导入所有函数,或者将 #' @importFrom packagename functionname添加到文件中以便导入函数。您可以在文件中使用任意数量的这些注释,因此可以在每个文件的顶部使用一组注释,或者在需要外部函数的每个函数中使用一组注释。

然后运行 devtools::document(),它会解析您的代码,寻找这些注释,然后为您创建一个适当的 NAMESPACE文件。放松。

假设您正在使用 RStudio、 Hadley 的 devtools包以及 DESCRIPTION文件的 Imports 部分中列出的 magrittr,下面是我为使 %>%在我的包函数中工作而采取的步骤。

首先,写入函数 foo.R:

#' Convert \code{data.frame} to \code{list}.
#'
#' @importFrom magrittr %>%
#' @name %>%
#' @rdname pipe
#' @export
#' @param x A \code{data.frame} object.
#' @examples
#' my_result <- foo(iris)
#'
foo <- function(x) {
x %>%
as.list()
}

第二,运行 devtools::document()

第三,运行 devtools::load_all()

这个这样的文件将在您的 R/目录中创建,您的函数应该按预期工作。

现在有一种更简单的方法来支持包中的管道。完美的软件包 usethis具有函数 use_pipe()。运行该函数一次,它就会处理所有事情。以下是 usethis文档中对 use_pipe()函数的描述:

在包中内部使用 magrittr 管道所需的设置 并为你的软件包的用户重新导出:

将 magrittr 添加到描述中的“ Imports”中

使用必要的氧气模板创建 R/utils-tube. R