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

如何在R自定义函数中用现有及新定义列定义case_when()的RHS?

解决R自定义函数中tidyeval的NSE问题

问题描述

需要编写自定义函数test_tidyeval,实现以下功能:

  • 传入数据集、两个新列名字符串、一个现有列(NSE形式传入)
  • 生成第一个新列:当Species为setosa时,值为传入列 + Sepal.Width + Petal.Length,否则等于传入列
  • 生成第二个新列:当Species为setosa时,值为第一个新列 + 100,否则为第一个新列 + 500

原代码在case_when()的右侧(RHS)存在tidyeval解析问题,无法正确引用传入的列和新生成的列。

修复后的代码

library(tidyverse)

test_tidyeval <- function(data, col_name, col_name_2, column1) {
  # 将字符串格式的新列名转换为符号
  new_col_sym <- sym(col_name)
  
  data %>%
    mutate(
      # 正确引用传入的NSE参数column1
      {{col_name}} := case_when(
        Species == "setosa" ~ {{column1}} + Sepal.Width + Petal.Length,
        TRUE ~ {{column1}}
      ),
      # 引用刚生成的新列,需用!!强制求值符号化的列名
      {{col_name_2}} := case_when(
        Species == "setosa" ~ !!new_col_sym + 100,
        TRUE ~ !!new_col_sym + 500
      )
    )
}

# 调用示例
iris %>% test_tidyeval("new_column_test", "new_column_test_2", Sepal.Length)

关键修复点

  • 传入列的引用:原代码中直接使用column1无法解析NSE参数,必须用{{column1}}包裹,让tidyeval正确识别传入的列(如Sepal.Length)。
  • 新生成列的引用:因为新列名是字符串传入,需要先用sym()将其转换为R可以识别的符号,再用!!(强制求值运算符)在case_when中引用这个刚生成的列。

内容的提问来源于stack exchange,提问作者Nautica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:01:03