2017-07-23 3 views
2

Subsetting und dann alsbind_rows und tidyeval Spleißen nicht

var <- c("wt", "mpg") 
mtcars %>% select(!!!var) -> df1 
mtcars %>% select(!!!var) -> df2 
bind_rows(df1, df2) 

erwartet Bindung funktioniert, aber wenn wir

bind_rows(
    mtcars %>% select(!!!var), 
    mtcars %>% select(!!!var) 
) 

es mit Error: only lists can be spliced

+0

Dies ist ein Fehler in Rlang, können Sie bitte ein Problem dort posten. – lionel

+0

Eigentlich habe ich gerade ein Problem geöffnet: https://github.com/tidyverse/rlang/issues/217 – lionel

Antwort

1

Dies ist ein Fehler in rlang die mit Wert Spleißen zu tun hat. Alle Funktionen, die Punkte verwenden, unterstützen das Spleißen, auch wenn sie ihre Eingabe nicht angeben. Dies ist praktisch, weil Sie do.call() mit diesen Funktionen nicht verwenden müssen, wenn Sie eine Liste von Argumenten haben, können Sie einfach die Liste spleißen.

Der Mechanismus ist aus technischen Gründen etwas anders. Es gibt derzeit einen Bug und Value-Splicing statt Call-Splicing wird innerhalb der select() Aufruf verwendet. Dies sollte in Kürze behoben werden.

1

Ich benutze nie !! oder !!! versagt Zwischenschritte überspringen, weil Es gibt oft etwas, was schief geht. Stattdessen verwende ich UQ. Ich weiß nicht, ob es eine gute Übung ist, aber es funktioniert.

bind_rows(
    UQ(mtcars %>% select(var)), 
    UQ(mtcars %>% select(var)) 
) 
+0

Ihr Code entspricht nicht Rickards. – lionel

+0

@lionel Dies ist möglich. Aber warum gibt es das gleiche Ergebnis? –

+1

Es gibt das gleiche Ergebnis, weil es nichts macht. In Rickards Version erzeugt das Spleißen diesen Aufruf: 'select (" wt "," mpg ")'. In Ihrer Version tut 'UQ()' nichts, und der Select-Aufruf sieht folgendermaßen aus: 'select (c (" wt "," mpg "))', das funktioniert auch (funktioniert aber nicht nächste Version, siehe https://github.com/tidyverse/dplyr/issues/2904) – lionel

Verwandte Themen