2

Sparkテーブルの列をジャンプしながら、コールenquo内でdplyrを使用できるようにしたいと思います。lapply

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 内から呼び出された場合は明らかにそうではありません。


編集

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 テーブルの列にジャンプして同じ機能を実現したいので、 deprecated を使用したくありませんselect_

4

1 に答える 1