我希望能够在跳过Spark表格列的同时在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
但是,当我尝试运行此代码时,我一直收到错误:
(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内部调用时,显然不是这种情况。
将闪光方面放在一边,可以提供更好,更可重复的例子:
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_
。
答案 0 :(得分: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