在函数中调用 dplyr::everything() 导致 Travis CI 构建失败
Calling dplyr::everything() in function causes Travis CI build to fail
我正在研究 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()
调用解决了问题 - 但是函数没有执行我想要的操作(return 所有变量)。
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 函数不同?
因为everything
不是dplyr导出的函数
> library(dplyr)
> everything
Error: object 'everything' not found
> dplyr:::everything
function (vars)
{
seq_along(vars)
}
<environment: namespace:dplyr>
使用 3 个冒号 :::
从命名空间或包访问未导出的函数。或者在这种情况下,由于它非常简单,您可以直接在 select
调用中使用 seq_along
(因为在编写包时引用其他人未导出的对象是一种不好的形式)。
编辑:实际上,您应该能够只执行 dplyr::select(*, everything())
而无需明确指定 everything
的命名空间。这是因为当 select
被调用时,它查找对象的搜索路径将包含它自己的命名空间。
我正在研究 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()
调用解决了问题 - 但是函数没有执行我想要的操作(return 所有变量)。
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 函数不同?
因为everything
不是dplyr导出的函数
> library(dplyr)
> everything
Error: object 'everything' not found
> dplyr:::everything
function (vars)
{
seq_along(vars)
}
<environment: namespace:dplyr>
使用 3 个冒号 :::
从命名空间或包访问未导出的函数。或者在这种情况下,由于它非常简单,您可以直接在 select
调用中使用 seq_along
(因为在编写包时引用其他人未导出的对象是一种不好的形式)。
编辑:实际上,您应该能够只执行 dplyr::select(*, everything())
而无需明确指定 everything
的命名空间。这是因为当 select
被调用时,它查找对象的搜索路径将包含它自己的命名空间。