sqlite 在dbplyr中使用cur_Column()和sym()

xwmevbvl  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(169)

我有这样一种情况,我需要划分数据库中的列,即across()多列。当除数列固定时,我可以使用!!rlang::sym()指定正确的列,但我有一个示例,其中除数列作为当前列名(即gsub("_lump_sum","_lump_noNAcount",dplyr::cur_column())的函数而更改。
请参见下面的示例:

library(dplyr, warn.conflicts = FALSE)

con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
copy_to(con, name ="mtcars", df=mtcars %>% mutate(across(c(gear,carb),~.*2,.names = "{col}_2")))

# This works as intended
tbl(con,"mtcars") %>% 
  summarise(across(any_of(c("vs","am")),~sum(.)/sum(!!sym("wt"))))

# This doesn't work
tbl(con,"mtcars") %>% 
  summarise(across(any_of(c("gear","carb")),~sum(.)/sum(!!sym(paste0(cur_column(),"_2")))))

# Error in `cur_column()`:
# ! Must be used inside `across()`.

我意识到cur_column()不能与!!一起使用,但我还需要在它进入数据库之前对其求值,因为cur_column()也不能在数据库端求值。
有没有其他方法来做这件事?谢谢

9lowa7mx

9lowa7mx1#

dbplyr的最新开发版本允许使用dbplyr::sql进行这种类型的评估,即:

tbl(con,"mtcars") %>% 
  summarise(across(any_of(c("gear","carb")), ~sum(.) / sum(sql(paste0(cur_column(),"_2")))))

相关问题