Как использовать цитирование и нецитирование при вызове функций tidyverse?

Я не понимаю, как использовать выражения и цитаты / аннотации / квазиквотации в контексте тидиверсии R. В следующем примере я подумал, что использование оператора отмены кавычек (!!) позволит мне сгенерировать необходимые аргументы для add_row после того, как я оценю выражение ex. Однако вместо этого я получаю эту ошибку. Я прочитал большую картину метапрограммирования и Quasiquotation в Advanced R, но я все еще не понимаю, как правильно использовать эти функции.

library(tidyverse)

# create sample data
df <- data.frame(x = 1:10, y = 11:20, z = 21:30)
df
#>     x  y  z
#> 1   1 11 21
#> 2   2 12 22
#> 3   3 13 23
#> 4   4 14 24
#> 5   5 15 25
#> 6   6 16 26
#> 7   7 17 27
#> 8   8 18 28
#> 9   9 19 29
#> 10 10 20 30
mini_df <- data.frame(x = 33:35, y = 43:45, z = 53:55)
mini_df
#>    x  y  z
#> 1 33 43 53
#> 2 34 44 54
#> 3 35 45 55

# store the expression I want to call in add_row
ex <- expr(paste0(names(df),':=',paste0('mini_df$',names(mini_df)),collapse=','))

# attempt to call add_row using arguments unquoted after evaluating expression ex
add_row(df,(!! eval(ex)), .after = 3L)
#> New rows in `add_row()` must use columns that already exist:
#> * Can't find column `"x:=mini_df$x,y:=mini_df$y,z:=mini_df$z"` in `.data`.

Создано 17 мая 2019 г. пакетом REPEX (v0.3.0)


person John D    schedule 18.05.2019    source источник


Ответы (1)


Оказывается, мне следовало использовать снятие кавычек, вызывая вместо этого UQS() или !!!. Мне вообще не нужно было использовать функции eval() или expr(). Вместо этого правильное использование было следующим:

library(tidyverse)
df <- data.frame(x = 1:10, y = 11:20, z = 21:30)
mini_df <- data.frame(x = 33:35, y = 43:45, z = 53:55)
add_row(df,!!!mini_df, .after = 3L)
#>     x  y  z
#> 1   1 11 21
#> 2   2 12 22
#> 3   3 13 23
#> 4  33 43 53
#> 5  34 44 54
#> 6  35 45 55
#> 7   4 14 24
#> 8   5 15 25
#> 9   6 16 26
#> 10  7 17 27
#> 11  8 18 28
#> 12  9 19 29
#> 13 10 20 30

Создано 17 мая 2019 г. пакетом REPEX (v0.3.0)

Подробнее об отключении и снятии кавычек см .:

Программирование с помощью dplyr - в частности, строка, в которой говорится: «Очень полезная функция unquote -сращивание состоит в том, что имена векторов становятся именами аргументов "

Квазиквотация

person John D    schedule 18.05.2019