R: 在自写包中使用 magrittr pipe operator

R: use magrittr pipe operator in self written package

我想在我自己编写的包中使用 magrittr 包中引入的管道运算符 %>% 来链接 dplyr 数据转换。 magrittrDESCRIPTION 文件中被列为 Import。加载我自己的包并测试使用管道运算符的函数后,我收到以下错误消息:

Error in functionname(parameter, : could not find function "%>%"

将函数源代码中的 %>% 更改为 magrittr::%>% 也无济于事,因为无法再构建包。

如果您在 Depends 中列出了 magrittr,它应该可以正常工作。然而,这是not advised。相反,您将 magrittr 保留在 Imports 中并将以下行添加到 NAMESPACE:

importFrom(magrittr,"%>%")

我建议阅读 Writing R extensions。您的问题在第 1.1.3 和 1.5.1 段中已涵盖。

另一个解决方案 - 使用 roxygen 包。它作为 devtools 包的一部分实现。安装 devtools 后,调用 devtools::document() 将为您更新 NAMESPACE。它还 auto-builds 带有文档的 .Rd 文件,很方便。

您只需在文件中添加格式为 #' @import packagename 的特殊注释以导入该包中的所有函数,或添加 #' @importFrom packagename functionname 以导入一个函数。您可以在文件中添加任意数量的此类注释,因此您可以在每个文件的顶部或每个需要外部函数的函数中添加一组。

然后你 运行 devtools::document() 它会解析你的代码以查找这些注释,然后它会为你创建一个合适的 NAMESPACE 文件。简单。

假设您使用的是 RStudio,Hadley 的 devtools 包,并在 DESCRIPTION 文件的导入部分中列出 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/ 目录中创建一个类似于 this 的文件,您的函数应该会按预期工作。

现在有一种更简单的方法来支持包中的管道。精彩包usethis具有函数use_pipe()。您 运行 只需运行一次,它就可以处理所有事情。 usethis 文档中 use_pipe() 函数是这样描述的:

Does setup necessary to use magrittr's pipe internally in your package and to re-export it for users of your package:

Adds magrittr to "Imports" in DESCRIPTION

Creates R/utils-pipe.R with the necessary roxygen template