如何在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
相关产品推荐
相关产品推荐

