如何在R包装函数中用字符变量指定被调函数的参数名?
解决R语言包装函数中字符参数名映射问题
你的问题核心是:如何把字符型的arg.name转换成被调用函数的实际参数名,而不是把arg.name本身当作参数传递。原代码报错是因为R会把arg.name作为参数名传给内部函数,但内部函数没有这个参数。
下面是两种可行的解决方法,推荐第一种,代码更简洁直观:
方法一:使用do.call构建参数列表
do.call可以接受一个参数列表,列表的名称对应函数的参数名,刚好能满足需求。修改包装函数如下:
# 内部函数示例(已有函数) EXISTING.FUNCTION <- function(a, n) { a + n^2 } # 修改后的包装函数 MY.WRAPPER.FUNCTION <- function(value, func, arg.name, ...) { # 先收集...中的所有参数 args <- list(...) # 将目标参数(arg.name对应名称,值为value)加入参数列表 args[[arg.name]] <- value # 调用目标函数 do.call(func, args) }
测试调用:
MY.WRAPPER.FUNCTION(value = 4, func = EXISTING.FUNCTION, arg.name = 'n', a = 3) # 输出:[1] 19
原理说明
- 用
list(...)收集包装函数中...传递的所有参数,形成一个参数列表 - 通过
args[[arg.name]] <- value,把字符型的arg.name作为列表的名称,对应值为value do.call(func, args)会把这个参数列表拆解成func的参数,完成正确调用
方法二:使用表达式构造与求值(进阶)
如果想通过substitute/eval这类求值函数实现,也可以用以下方式,不过代码相对复杂:
MY.WRAPPER.FUNCTION <- function(value, func, arg.name, ...) { # 构造参数对列表:把目标参数和...参数合并 param_pair <- c(setNames(list(value), arg.name), list(...)) # 构造函数调用表达式 call_expr <- substitute(func(ARGS), list(ARGS = as.pairlist(param_pair))) # 执行表达式得到结果 eval(call_expr) }
实际场景适配(分位数函数)
针对你提到的概率分布分位数函数场景,比如兼容参数名为p的标准分位数函数和自定义的参数名为prob的分位数函数:
# 标准分位数函数(参数p) standard_quantile <- qnorm # 自定义分位数函数(参数prob) custom_quantile <- function(prob, mean = 0, sd = 1) { qnorm(p = prob, mean = mean, sd = sd) } # 调用标准分位数函数,指定arg.name为"p" MY.WRAPPER.FUNCTION(value = 0.95, func = standard_quantile, arg.name = "p", mean = 5, sd = 1) # 调用自定义分位数函数,指定arg.name为"prob" MY.WRAPPER.FUNCTION(value = 0.95, func = custom_quantile, arg.name = "prob", mean = 10, sd = 2)
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

