R: use magrittr pipe operator in self written package
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.
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.