如何在tidy选择中使用`{{ }}`创建的变量?
问题原因与解决方案
问题出在哪?
你在separate_rows()里用all_of("{{ col }}_suffixed")是错误的——双引号包裹的{{ col }}不会被rlang解析,all_of()拿到的是字面量字符串"{{ col }}_suffixed",而不是动态生成的实际列名(比如Species_suffixed),自然找不到对应的列。
而mutate()里的"{{ col }}_suffixed" := ...能正常工作,是因为这里的字符串插值是tidyverse专门支持的语法,会自动把{{ col }}替换成传入的参数名,生成正确的列名。
两种修正方法
方法1:直接在tidy选择中使用动态列名语法
separate_rows()的参数支持tidy选择语法,直接用{{ col }}_suffixed就能正确解析出目标列:
library(dplyr, warn.conflicts = FALSE) library(tidyr) foo <- function(col) { head(iris) |> select({{ col }}) |> mutate("{{ col }}_suffixed" := paste({{ col }}, "SUF")) |> separate_rows({{ col }}_suffixed, sep = " ") } foo(Species)
方法2:提前生成列名字符串
先把动态列名存成变量,再在后续步骤中调用,这种方式更灵活,适合复杂场景:
library(dplyr, warn.conflicts = FALSE) library(tidyr) library(rlang) foo <- function(col) { # 将传入的列参数转为字符串,拼接后缀得到新列名 new_col_name <- paste0(as_name(ensym(col)), "_suffixed") head(iris) |> select({{ col }}) |> mutate(!!new_col_name := paste({{ col }}, "SUF")) |> separate_rows(all_of(new_col_name), sep = " ") } foo(Species)
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

