2016-05-05 2 views
0

Я работаю над пакетом R, размещенным на GitHub. Когда я добавляю dplyr::everything() к моей функции, это приводит к сбою сборки Travis CI (хотя он устанавливается нормально локально). Ошибка Travis обвиняет функцию everything() в dplyr, и, конечно же, когда я ее удаляю, проблема решена. Функция:Вызов функции dplyr :: everything() приводит к сбою Travis CI

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() вызов решает проблему - но тогда функция не делать то, что я хочу (вернуть все переменные).

Сообщение об ошибке Трэвис включает в себя:

>>> 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 я использую?

ответ

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, путь поиска, в котором он ищет объекты, будет содержать свое собственное пространство имен.

+0

Полезный пример. Я использую Dev-версию dplyr из GitHub 0.4.3.9001, и теперь я вижу, что эта функция была экспортирована только как [коммит в марте] (https://github.com/ hadley/dplyr/commit/2151d8b75e9d9d76ce59d1863acbdf103b4f537a) и еще не включен в версию CRAN. Таким образом, мое замешательство и неудача Трэвиса. Не указывать пространство имен для 'все'! –