%>% is called the forward pipe operator in R. It provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. It is defined by the package magrittr (CRAN) and is heavily used by dplyr (CRAN).
The pipe operator is a special operational function available under the magrittr and dplyr package (basically developed under magrittr), which allows us to pass the result of one function/argument to the other one in sequence. It is generally denoted by symbol %>% in R Programming.
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.
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
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With