Как использовать кавычки и неквотирование при вызове функций tidyverse? - PullRequest
1 голос
/ 18 мая 2019

Я не понимаю, как использовать выражения и цитаты / не цитаты / квазиквотации в контексте тидиверса R.В следующем примере я подумал, что использование оператора unquote (!!) позволит мне сгенерировать необходимые аргументы для add_row после того, как я вычислю выражение ex.Однако вместо этого я получаю эту ошибку.Я прочитал главы Metaprogramming Big Picture и 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`.

Создано в 2019-05-17 с помощью пакета Представить (v0.3.0)

1 Ответ

1 голос
/ 18 мая 2019

Оказывается, я должен был использовать сплайсинг без кавычек, вызывая 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

Создано в 2019-05-17 с помощью пакета Представления (v0.3.0)

Подробнее об отмене цитирования и объединении цитат см.

Программирование с помощью dplyr - в частности, строка, которая гласит: «Очень полезная особенность объединения без кавычек заключается в том, что имена векторов становятся именами аргументов»

Quasiquotation

...