Trying to build my first R
package using roxygen2
and devtools
. I have added a function that uses %>%
and mutate
in the @examples
section. When I run check()
it fails, because it cannot find the function %>%
or mutate
.
Based on this, this, and this I have tried the following:
I have #' importFrom magrittr %>%
and #' importFrom dplyr mutate
in the function's .R
file. I also have magrittr
and dplyr
under Imports:
in the DESCRIPTION
file. After running document()
, my NAMESPACE
file contains importFrom(dplyr,mutate)
and importFrom(magrittr,"%>%")
.
minimal R/test.R
file:
#' Conditional mutate
#'
#' \code{mutate_cond} mutates the \code{data.frame} only on the rows that
#' satisfy the condition.
#'
#' @param .data \code{data.frame}
#' @param condition expression with the condition to be evaluated
#' @param ... arguments passed to \code{mutate}
#' @param envir environment inherited from \code{parent.frame()}
#'
#' @return \code{data.frame}
#' @importFrom dplyr mutate
#' @importFrom magrittr %>%
#'
#' @examples
#' data(iris)
#' iris %>%
#' mutate(aux = 0) %>%
#' mutate_cond(Petal.Length > 1.3,aux = 3)
#'
#' @export
mutate_cond <- function(.data, condition, ..., envir = parent.frame()) {
condition <- eval(substitute(condition), .data, envir)
.data[condition, ] <- .data[condition, ] %>% mutate(...)
.data
}
minimal DESCRIPTION
file:
Package: test
Version: 0.1
Date: 2019-06-07
Title: Functions
Description: Some functions I use.
Author: me
Maintainer: me <[email protected]>
Encoding: UTF-8
License: GPL-3
Imports: dplyr, magrittr
NAMESPACE
generated with document()
:
# Generated by roxygen2: do not edit by hand
export(mutate_cond)
importFrom(dplyr,mutate)
importFrom(magrittr,"%>%")
I expect this example code to run successfully and pass check()
. Instead I get this error message:
❯ checking examples ... ERROR
Running examples in ‘test-Ex.R’ failed
The error most likely occurred in:
> base::assign(".ptime", proc.time(), pos = "CheckExEnv")
> ### Name: mutate_cond
> ### Title: Conditional mutate
> ### Aliases: mutate_cond
>
> ### ** Examples
>
> data(iris)
> iris %>%
+ mutate(aux = 0) %>%
+ mutate_cond(Petal.Length > 1.3,aux = 3)
Error in iris %>% mutate(aux = 0) %>% mutate_cond(Petal.Length > 1.3, :
could not find function "%>%"
Execution halted
1 error ✖ | 0 warnings ✔ | 0 notes ✔
Also, if I add require(dplyr)
and require(magrittr)
to the @examples
section the error goes away or if I remove the whole @examples
section the error goes away.
Why won't this package pass check()
?
Thank you!
%>%
is imported that means you can use it in the code of your package, but not in the examples. So addrequire(magrittr)
in the example. – Pustulate%>%
function available to the users of your package without the need to load themagrittr
package, by importing it and then exporting it. See here for example. – Pustulatestats
package in examples without loadingstats
. Is that because it is a default package whiledplyr
andmagrittr
are not? Thanks. – Compoundrequire(magrittr)
without checking the return status is meaningless: execution will happily continue if the package is not available, which is almost certainly not what you want in that case. If you are going to load a library in code, either doif (require(magrittr))...
orlibrary(magrittr)
, never dorequire(...)
by itself. (Good reads: https://mcmap.net/q/63717/-what-is-the-difference-between-require-and-library and yihui.name/en/2014/07/library-vs-require/.) – Ellerdstats
is a base package. You never need to load it. @r2evans: Agreed. – Pustulatebase
. Others are loaded by default (e.g. typicallystats
,graphics
,grDevices
,utils
,datasets
,methods
), but there are other base packages which are not loaded unless you ask for them, e.g.compiler
,grid
,parallel
, etc.) – Kirststats
is nevertheless called a "base" package. It is inr-base
. But that's not very important ^^ – Pustulatecomplete.cases
, then aRcmd check
is likely going to complain about a function not defined in the global environment. As an example,stats
is a "base" package (so installed with R) and is always available to be loaded in a session -- in interactive sessions it is loaded by default -- but is not automatically loaded all of the time. You are right that they are not to be updated separately, but I think that's ancillary to this discussion. – Ellerd