bind_rows и tidyeval не работают

Подмножество, а затем привязка работают должным образом

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

Но если пропустить промежуточные шаги

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

это не удается с Error: only lists can be spliced


person Rickard    schedule 23.07.2017    source источник
comment
Это ошибка в rlang, не могли бы вы опубликовать там проблему.   -  person Lionel Henry    schedule 23.07.2017
comment
На самом деле я только что открыл проблему: github.com/tidyverse/rlang/issues/217   -  person Lionel Henry    schedule 23.07.2017


Ответы (2)


Это ошибка в rlang, связанная с объединением значений. Все функции, использующие точки, поддерживают склейку, даже если они не цитируют свой ввод. Это удобно, потому что вам не нужно использовать do.call() с этими функциями, когда у вас есть список аргументов, вы можете просто объединить список.

Механизм немного другой по техническим причинам. В настоящее время существует ошибка, и в вызове select() используется объединение значений вместо объединения вызовов. Это должно быть исправлено в ближайшее время.

person Lionel Henry    schedule 23.07.2017

Я никогда не использую !! или !!!, потому что часто что-то идет не так. Вместо этого я использую UQ. Не знаю, хорошая ли это практика, но работает.

bind_rows(
  UQ(mtcars %>% select(var)),
  UQ(mtcars %>% select(var))
)
person F. Privé    schedule 23.07.2017
comment
@lionel Это возможно. Но почему дает такой же результат? - person F. Privé; 23.07.2017
comment
Он дает тот же результат, потому что ничего не делает. В версии Рикарда соединение создает такой вызов: select("wt", "mpg"). В вашей версии UQ() ничего не делает, и вызов select выглядит следующим образом: select(c("wt", "mpg")), который тоже работает (но не будет работать в следующей версии, см. github.com/tidyverse/dplyr/issues/2904) - person Lionel Henry; 23.07.2017