You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:42:57