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

如何在R自定义函数中替代整洁评估(双大括号)采用标准评估

无{{}}的等价R函数实现

下面提供两种符合要求的实现方案,分别对应不同的调用习惯:

方案1:纯标准求值(接收字符串列名)

这种方式完全遵循标准求值规则,函数参数需要传入列名的字符串形式:

id <- 1:30
x <- rnorm(30,1,10)
y <- rnorm(30,1,10)

data <- data.frame(id,x,y)

add_se <- function(data, y_1, y_2){
  dplyr::mutate(data,
         higher_one = dplyr::case_when(
           .data[[y_1]] > .data[[y_2]] ~ "1",
           .data[[y_1]] < .data[[y_2]] ~ "2",
           .data[[y_1]] == .data[[y_2]] ~ "equal"
         ))
}

# 调用时传入字符串列名
data2 <- add_se(data, "x", "y")

核心是用.data[[列名字符串]]的方式引用数据框中的列,这是dplyr推荐的标准求值写法,避免了非标准求值的语法。

方案2:保持原调用方式(裸列名),不用{{}}

如果希望保持原函数的调用习惯(直接传裸列名),可以用rlang::enquo捕获参数,再用!!注入到表达式中,替代{{}}的功能:

id <- 1:30
x <- rnorm(30,1,10)
y <- rnorm(30,1,10)

data <- data.frame(id,x,y)

add_no_brace <- function(data, y_1, y_2){
  # 捕获输入的列名表达式
  y1_expr <- rlang::enquo(y_1)
  y2_expr <- rlang::enquo(y_2)
  
  dplyr::mutate(data,
         higher_one = dplyr::case_when(
           !!y1_expr > !!y2_expr ~ "1",
           !!y1_expr < !!y2_expr ~ "2",
           !!y1_expr == !!y2_expr ~ "equal"
         ))
}

# 调用方式和原函数完全一致
data2 <- add_no_brace(data, x, y)

这种写法本质还是用到了tidy求值的底层API,但去掉了{{}}语法,同时保留了原函数的调用便捷性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:10:22