2016-05-05 5 views
0

Ich arbeite an einem R-Paket, das auf GitHub gehostet wird. Wenn ich meiner Funktion dplyr::everything() hinzufüge, führt dies dazu, dass das Travis CI-Build fehlschlägt (obwohl es lokal korrekt installiert wird). Der Travis-Fehler macht die everything()-Funktion in dplyr verantwortlich, und tatsächlich, wenn ich es entferne, ist das Problem gelöst. Die Funktion ist:Der Aufruf von dplyr :: everything() in der Funktion bewirkt, dass Travis CI-Build fehlschlägt

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 
} 

Entfernen dass dplyr::everything() Anruf das Problem löst - aber dann wird die Funktion nicht tun, was ich will (Rückkehr alle Variablen).

Die Travis Fehlermeldung enthält:

>>> 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’ 

Warum ist everything() anders verhalten als die anderen dplyr Funktionen ich verwende?

Antwort

4

Weil everything keine Funktion ist, die von dplyr exportiert wird.

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

Gebrauch 3 Doppelpunkte ::: unexported Funktionen aus einem Namensraum oder das Paket zuzugreifen. Oder in diesem Fall, da es so einfach ist, könnten Sie einfach seq_along direkt in Ihrem select Aufruf verwenden (da es schlechte Form ist, beim Schreiben eines Pakets auf die nicht exportierten Objekte einer anderen Person zu verweisen).

Edit: Eigentlich sollten Sie dplyr::select(*, everything()) tun können, ohne explizit den Namespace für everything anzugeben. Dies liegt daran, dass der Suchpfad, in dem nach Objekten gesucht wird, einen eigenen Namespace enthält, wenn select aufgerufen wird.

+0

Hilfreiches Beispiel - Ich verwende lokal die dev-Version von dplyr von GitHub, 0.4.3.9001, und jetzt sehe ich, dass diese Funktion erst ab dem [commit im März] exportiert wurde (https://github.com/ hadley/dplyr/commit/2151d8b75e9d9d76ce59d1863acbdf103b4f537a) und ist noch nicht in der CRAN-Version. Also meine Verwirrung und das Versagen von Travis. Der Namespace für 'alles' wurde nicht angegeben! –

Verwandte Themen