在tidyverse过滤中使用与变量同名的字符串,{{}}语法为何无效?
问题解答
你用{{ spalte }}的写法确实不可行,核心原因是curly-curly({{ }})操作符的作用是注入符号/表达式,而非解析字符串变量:
- 你的
spalte是一个字符串值("fte2020"),当你用{{ spalte }}时,它会直接把这个字符串当成列名去匹配,而你的tibble里并没有名为"fte2020"(带引号的字符串)的列,实际列名是fte2020(符号形式),所以会报错找不到对应列。
为什么你的其他写法可行
get(spalte):get()函数会根据字符串在当前环境中查找对应的对象,这里就是定位到tibble里的fte2020列.data[[spalte]]:.data是tidyverse中专门指代数据框的代词,双括号[[ ]]支持通过字符串索引到对应的列,这也是tidyverse官方推荐的处理字符串列名的方式
如果想用{{ }}怎么改?
如果一定要用curly-curly,需要先把字符串转换成符号(symbol),用rlang::sym()来实现:
library(rlang) jahr <- 2020 test <- tibble(jahr = c(2019, 2020), fte2020 = c(10, 11), fte2021 = c(12,13)) spalte <- sym(paste0("fte", jahr)) test %>% filter({{ spalte }} == 11)
这里sym()把字符串"fte2020"转成了符号fte2020,{{ }}再把这个符号注入到filter()的表达式中,就等价于直接写fte2020 == 11,自然就能正常过滤了。
内容的提问来源于stack exchange,提问作者arnyeinstein
相关产品推荐
相关产品推荐

