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 【问题描述】:

尝试使用roxygen2devtools 构建我的第一个R 包。我在@examples 部分添加了一个使用%>%mutate 的函数。当我运行check() 时它失败了,因为它找不到函数%>%mutate

基于this、this和this,我尝试了以下方法:

我在函数的.R 文件中有#' importFrom magrittr %>%#' importFrom dplyr mutate。我在DESCRIPTION 文件中的Imports: 下也有magrittrdplyr。运行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

NAMESPACEdocument() 生成:

# 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()

谢谢!

【问题讨论】:

如果 %&gt;% 被导入,这意味着您可以在包的代码中使用它,但不能在示例中使用。所以在示例中添加require(magrittr) 或者你可以让你的包的用户可以使用%&gt;%函数,而不需要加载magrittr包,方法是导入它然后导出它。例如,请参阅here。 在不加载 stats 的示例中使用 stats 包中的函数似乎没有任何问题。那是因为它是默认包,而 dplyrmagrittr 不是?谢谢。 顺便说一句(和@StéphaneLaurent),使用require(magrittr)而不检查返回状态是没有意义的:如果包不可用,执行将很高兴继续,这几乎肯定不是你想要的那种情况.如果要在代码中加载库,请执行 if (require(magrittr))...library(magrittr),切勿单独执行 require(...)。 (好读:***.com/q/5595512 和 yihui.name/en/2014/07/library-vs-require/.) @StéphaneLaurent:这是不对的。唯一保证存在的包是base。其他默认情况下会加载(例如,通常是 statsgraphicsgrDevicesutilsdatasetsmethods),但还有其他基本包不会加载,除非您要求它们,例如compilergridparallel等) 【参考方案1】:

添加

exportPattern("^[[:alpha:]]+")

到我的 NAMESPACE 文件解决了我这边的问题。

【讨论】:

【参考方案2】:

在控制台中运行 usethis::use_pipe() 也可以解决问题。

【讨论】:

以上是关于R 包失败 devtools::check,因为“找不到函数”,即使该函数已导入 NAMESPACE的主要内容,如果未能解决你的问题,请参考以下文章

在哪里放置 CRAN 提交的包小插曲?

SQL 作业失败,因为驱动程序无效

R 构建包在 zip 上失败

R - 尝试安装包时:InternetOpenUrl 失败

生成R.java文件失败 这是怎么回事

R 包开发:测试通过控制台,但通过 devtools::test() 失败