Использование dklyr enquo для доступа к столбцам таблицы Spark через sparklyr

Я хотел бы быть ebale, чтобы использовать dplyr enquo в lapply вызов при прыжке через столбцы таблицы Spark.

lapply(tbl_vars(sprkTbl),
       function(col_nme) {
           print(col_nme)
           # Enquoe column name
           quo_col_nme <- enquo(col_nme)
           print(quo_col_nme)

           sprkTbl %>%
               select(!!quo_col_nme) %>% 
               # do stuff
               collect -> dta_res
       }) -> l_res

Однако, когда я пытаюсь запустить этот код, я продолжаю получать ошибку:

Ошибка в (function (x, strict = TRUE): аргумент уже оценен

Я выделил ошибку enquo:

>> lapply(tbl_vars(sprkTbl),
...        function(col_nme) {
...            print(col_nme)
...            # Enquoe column name
...            quo_col_nme <- enquo(col_nme)
...            # print(quo_col_nme)
...            
...            # sprkTbl%>%
...            #     select(!!quo_col_nme) %>% 
...            #     # do stuff
...            #     collect -> dta_res
...        }) -> l_res
[1] "first_column_in_spark"

(а потом та же ошибка)

Ошибка в (function (x, strict = TRUE): аргумент уже оценен

Я хочу понять почему enquo не может быть использовано таким образом. tbl_vars возвращает обычный символьный вектор, не должен ли col_name быть строкой? Я хотел бы предусмотреть, чтобы синтаксис работал так же, как в:

mtcars %>% select(!!enquote("am")) %>% head(2)
              am
Mazda RX4      1
Mazda RX4 Wag  1

но, очевидно, это не тот случай, когда он вызывается изнутри.


редактировать

оставляя искрящийся аспект на стороне, можно привести лучший и более воспроизводимый пример:

lapply(names(mtcars),function(x) {
    col_enq <- enquo(x)
    mtcars %>% 
        select(!!col_enq) %>% 
        head(2)
})

выдает одинаковую ошибку.

Желаемые результаты

Старый _ работает синтаксис

lapply(names(mtcars),function(x) {
    # col_enq <- enquo(x)
    mtcars %>% 
        select_(x) %>% 
        head(2)
})

Одним словом, я хочу достичь той же функциональности, переходя к столбцам таблицы Spark, и я бы предпочел не использовать устаревшие select_,

1 ответ

Решение

Правильно ли я понимаю ваш вопрос, что вас интересует этот результат? Или вы обязаны использовать enquo вместо quo?

library(dplyr)

lapply(names(mtcars),function(x) {
  col_enq <- quo(x)
  mtcars %>% 
    select(!!col_enq) %>% 
    head(2)
})
#> [[1]]
#>               mpg
#> Mazda RX4      21
#> Mazda RX4 Wag  21
#> 
#> [[2]]
#>               cyl
#> Mazda RX4       6
#> Mazda RX4 Wag   6
#> 
#> [[3]]
#>               disp
#> Mazda RX4      160
#> Mazda RX4 Wag  160
#> 
#> [[4]]
#>                hp
#> Mazda RX4     110
#> Mazda RX4 Wag 110
#> 
#> [[5]]
#>               drat
#> Mazda RX4      3.9
#> Mazda RX4 Wag  3.9
#> 
#> [[6]]
#>                  wt
#> Mazda RX4     2.620
#> Mazda RX4 Wag 2.875
#> 
#> [[7]]
#>                qsec
#> Mazda RX4     16.46
#> Mazda RX4 Wag 17.02
#> 
#> [[8]]
#>               vs
#> Mazda RX4      0
#> Mazda RX4 Wag  0
#> 
#> [[9]]
#>               am
#> Mazda RX4      1
#> Mazda RX4 Wag  1
#> 
#> [[10]]
#>               gear
#> Mazda RX4        4
#> Mazda RX4 Wag    4
#> 
#> [[11]]
#>               carb
#> Mazda RX4        4
#> Mazda RX4 Wag    4
Другие вопросы по тегам