121

I would like to use the pipe-operator %>% introduced in the magrittr package in a package I wrote myself to chain dplyr data transformations. magrittr is listed as Import in the DESCRIPTION file. After loading my own package and testing the function which uses the pipe-operator I get the following error message:

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

Changing %>% to magrittr::%>% in the function source code does not help either because the package cannot be built anymore.

4

4 回答 4

116

magrittr如果您在 中列出,它应该可以正常工作Depends。但是,不建议这样做。相反,您离开并将以下行添加magrittr到:ImportsNAMESPACE

importFrom(magrittr,"%>%")

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

于 2015-01-16T08:11:30.743 回答
50

现在有一种更简单的方法来支持包中的管道。奇葩包usethis有功能use_pipe()。您运行该函数一次,它会处理所有事情。这是文档use_pipe()中描述该功能的方式usethis

是否需要在您的包内部使用 magrittr 的管道并为您的包的用户重新导出它:

将 magrittr 添加到说明中的“导入”

使用必要的 roxygen 模板创建 R/utils-pipe.R

于 2018-09-08T03:06:00.000 回答
35

另一种解决方案 - 使用roxygen包。它作为devtools包的一部分实现。devtools安装后,呼叫将为您devtools::document()更新。NAMESPACE它还自动构建带有文档的 .Rd 文件,这很方便。

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

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

于 2016-01-20T15:32:32.910 回答
20

Assuming that you're using RStudio, Hadley's devtools package, and listed magrittr in the Imports section of the DESCRIPTION file, here are steps I took to make %>% work in my package function(s).

First, write function 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()
}

Second, run devtools::document().

Third, run devtools::load_all().

A file like this will be created in your R/ directory and your function should work as expected.

于 2016-01-21T17:21:14.153 回答