问题
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.
回答1:
It should have worked correctly if you had magrittr
listed in Depends
. However, this is not advised. Instead, you leave magrittr
in Imports
and add the following line to NAMESPACE
:
importFrom(magrittr,"%>%")
I suggest reading Writing R extensions. Your question is covered in paragraphs 1.1.3 and 1.5.1.
回答2:
One additional solution - use the roxygen
package. It's implemented as part of the devtools
package. Once devtools
is installed, calling devtools::document()
will update your NAMESPACE
for you. It also auto-builds .Rd files with documentation, which is handy.
All you do is add a special comment in the format #' @import packagename
to a file to import all functions from that package, or #' @importFrom packagename functionname
to import a function. You can have as many of these comments as you want in your files, so you can have a set of them at the top of each file, or with each of your functions that needs an external function.
Then you run devtools::document()
and it parses your code looking for those comments, and then it creates an appropriate NAMESPACE
file for you. Easy.
回答3:
There's now an easier way to support the pipe in your packages. The wonderful package usethis
has the function use_pipe()
. You run that function once and it handles everything. This is how the use_pipe()
function is described in the usethis
documentation:
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
回答4:
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.
来源:https://stackoverflow.com/questions/27947344/r-use-magrittr-pipe-operator-in-self-written-package