R语言如何检查并修改作为函数参数传入的调用的参数
R语言如何检查并修改作为参数传入的函数调用参数
实现思路
- 利用R的惰性求值特性,先捕获传入的未求值调用表达式,避免缺省参数直接触发报错
- 提取调用的参数列表,检查必填参数
arg2是否存在 - 若
arg2缺失,将传入的arg3作为值补入arg2位置 - 对修改后的调用执行求值,返回结果
代码实现
首先是基础函数a的定义:
a <- function(arg1, arg2) { return(arg1 + arg2) }
基于rlang的实现
你提到的rlang::call_modify完全可以实现需求,只需要先捕获未求值的调用即可:
library(rlang) b <- function(CALL, arg3) { # 捕获未求值的调用表达式 call_expr <- enexpr(CALL) # 提取调用的参数列表 params <- call_args(call_expr) # 检查是否缺失arg2 if (!"arg2" %in% names(params)) { # 补入arg2参数 call_expr <- call_modify(call_expr, arg2 = arg3) } # 求值并返回结果 return(eval_bare(call_expr)) }
基础R实现(无需加载第三方包)
如果不想依赖rlang,也可以用原生R函数实现:
b <- function(CALL, arg3) { call_expr <- substitute(CALL) if (!"arg2" %in% names(as.list(call_expr)[-1])) { call_expr$arg2 <- arg3 } return(eval(call_expr, envir = parent.frame())) }
效果测试
运行测试用例,结果完全符合预期:
# 已传入arg2的场景,返回1+2=3 b(CALL = a(arg1 = 1, arg2 = 2), arg3 = 3) # 未传入arg2的场景,自动用arg3=3填充,返回1+3=4 b(CALL = a(arg1 = 1), arg3 = 3)
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

