R 包失败 devtools::check,因为“找不到函数”,即使该函数已导入 NAMESPACE
Posted
技术标签:
【中文标题】R 包失败 devtools::check,因为“找不到函数”,即使该函数已导入 NAMESPACE【英文标题】:R package fails devtools::check, because "could not find function" even though the function is imported in NAMESPACE 【发布时间】:2019-10-23 19:57:35 【问题描述】:尝试使用roxygen2
和devtools
构建我的第一个R
包。我在@examples
部分添加了一个使用%>%
和mutate
的函数。当我运行check()
时它失败了,因为它找不到函数%>%
或mutate
。
基于this、this和this,我尝试了以下方法:
我在函数的.R
文件中有#' importFrom magrittr %>%
和#' importFrom dplyr mutate
。我在DESCRIPTION
文件中的Imports:
下也有magrittr
和dplyr
。运行document()
后,我的NAMESPACE
文件包含importFrom(dplyr,mutate)
和importFrom(magrittr,"%>%")
。
最小的R/test.R
文件:
#' Conditional mutate
#'
#' \codemutate_cond mutates the \codedata.frame only on the rows that
#' satisfy the condition.
#'
#' @param .data \codedata.frame
#' @param condition expression with the condition to be evaluated
#' @param ... arguments passed to \codemutate
#' @param envir environment inherited from \codeparent.frame()
#'
#' @return \codedata.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
最小的DESCRIPTION
文件:
Package: test
Version: 0.1
Date: 2019-06-07
Title: Functions
Description: Some functions I use.
Author: me
Maintainer: me <myemail@email.com>
Encoding: UTF-8
License: GPL-3
Imports: dplyr, magrittr
NAMESPACE
用document()
生成:
# Generated by roxygen2: do not edit by hand
export(mutate_cond)
importFrom(dplyr,mutate)
importFrom(magrittr,"%>%")
我希望这个示例代码能够成功运行并通过check()
。相反,我收到此错误消息:
❯ 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 ✔
另外,如果我将require(dplyr)
和require(magrittr)
添加到@examples
部分,错误就会消失,或者如果我删除整个@examples
部分,错误就会消失。
为什么这个包不能通过check()
?
谢谢!
【问题讨论】:
如果%>%
被导入,这意味着您可以在包的代码中使用它,但不能在示例中使用。所以在示例中添加require(magrittr)
。
或者你可以让你的包的用户可以使用%>%
函数,而不需要加载magrittr
包,方法是导入它然后导出它。例如,请参阅here。
在不加载 stats
的示例中使用 stats
包中的函数似乎没有任何问题。那是因为它是默认包,而 dplyr
和 magrittr
不是?谢谢。
顺便说一句(和@StéphaneLaurent),使用require(magrittr)
而不检查返回状态是没有意义的:如果包不可用,执行将很高兴继续,这几乎肯定不是你想要的那种情况.如果要在代码中加载库,请执行 if (require(magrittr))...
或 library(magrittr)
,切勿单独执行 require(...)
。 (好读:***.com/q/5595512 和 yihui.name/en/2014/07/library-vs-require/.)
@StéphaneLaurent:这是不对的。唯一保证存在的包是base
。其他默认情况下会加载(例如,通常是 stats
、graphics
、grDevices
、utils
、datasets
、methods
),但还有其他基本包不会加载,除非您要求它们,例如compiler
、grid
、parallel
等)
【参考方案1】:
添加
exportPattern("^[[:alpha:]]+")
到我的 NAMESPACE 文件解决了我这边的问题。
【讨论】:
【参考方案2】:在控制台中运行 usethis::use_pipe()
也可以解决问题。
【讨论】:
以上是关于R 包失败 devtools::check,因为“找不到函数”,即使该函数已导入 NAMESPACE的主要内容,如果未能解决你的问题,请参考以下文章