使用 dplyr 的 enquo 通过 sparklyr 访问 Spark table 列

Using dplyr's enquo to access Spark table columns via sparklyr

我希望在跳过 Spark table 列时能够在 lapply 调用中使用 dplyr 的 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

然而,当我尝试 运行 这段代码时,我不断收到错误消息:

Error in (function (x, strict = TRUE) : the argument has already been evaluated

我已将错误隔离到 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"

(然后同样报错)

Error in (function (x, strict = TRUE) : the argument has already been evaluated

我想明白为什么 enquo 不能那样用。 tbl_vars returns 一个普通的字符向量, col_name 不应该是一个字符串吗?我会设想语法以与以下相同的方式工作:

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

但是,当从 lapply.

中调用时,显然情况并非如此

编辑

将 sparklyr 方面放在一边,可以提供一个更好、更可重现的示例:

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 table 列来实现相同的功能,我不想使用已弃用的 select_.

您对这个结果感兴趣,我是否正确理解了您的问题?还是您一定要使用 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