在函数中调用dplyr :: everything()会导致Travis CI构建失败

时间:2016-05-05 01:46:26

标签: r dplyr travis-ci

我正在开发一个在GitHub上托管的R包。当我向我的函数添加dplyr::everything()时,它会导致Travis CI构建失败(尽管它在本地安装正常)。 Travis错误归咎于dplyr中的everything()函数,果然,当我删除它时,问题就解决了。 功能是:

get_dupes <- function(dat, ...) {
  dupes <- dat %>%
    dplyr::group_by(...) %>%
    dplyr::filter(n() > 1)  %>%
    dplyr::mutate(dupe_count = n()) %>%
    dplyr::select(..., dupe_count, dplyr::everything()) %>%
    dplyr::ungroup() %>%
    dplyr::arrange(...)

  var_names <- sapply(as.list(substitute(list(...)))[-1L], deparse)

  if(nrow(dupes) == 0){return(paste0("No duplicate combinations found of: ", paste(var_names, collapse = ", ")))}
  dupes
}

删除dplyr::everything()调用可以解决问题 - 但是函数没有按我的意愿执行(返回所有变量)。

Travis错误消息包括:

>>> Filename: janitor.Rcheck/00install.out <<<
* installing *source* package ‘janitor’ ...
** R
** preparing package for lazy loading
Error : object ‘everything’ is not exported by 'namespace:dplyr'
ERROR: lazy loading failed for package ‘janitor’
* removing ‘/home/travis/build/sfirke/janitor/janitor.Rcheck/janitor’

为什么everything()的行为与我正在使用的其他dplyr函数不同?

1 个答案:

答案 0 :(得分:4)

因为everything不是dplyr导出的函数。

> library(dplyr)
> everything
Error: object 'everything' not found
> dplyr:::everything
function (vars) 
{
    seq_along(vars)
}
<environment: namespace:dplyr>

使用3个冒号:::从命名空间或包中访问未导出的函数。或者在这种情况下,由于它非常简单,您可以直接在seq_along调用中使用select(因为在编写程序包时引用其他人未导出的对象是不好的形式)。

编辑:实际上,您应该能够dplyr::select(*, everything())而不明确指定everything的命名空间。这是因为调用select时,查找对象的搜索路径将包含自己的命名空间。