R语言中如何获取...参数形式函数的实际传入参数名称?
解决R语言中获取
...参数实际名称的问题 这问题我之前踩过坑!用formalArgs()或者formals()确实拿不到...里的实际参数名——因为这俩函数只能读取函数定义阶段的形参结构,而你要的是调用阶段传入的真实参数名称/表达式,得换个思路来搞。
下面给你两个实用的解决方案:
方法1:用match.call()捕获完整调用表达式
match.call()是处理这类问题的利器,它能精准捕获函数被调用时的完整表达式,包括所有传入的参数细节。直接上代码:
entropy <- function(...) { # 获取当前函数的调用表达式 call_details <- match.call() # 提取`...`对应的所有参数部分 dot_args <- call_details[["..."]] # 将每个参数表达式转换为字符串(即参数名/传入的表达式) arg_names <- sapply(dot_args, deparse) # 返回结果 return(arg_names) } # 测试示例 h1 <- 1:5 h2 <- 6:10 h3 <- 11:15 entropy(h1, h2, h3) # 输出:[1] "h1" "h2" "h3"
原理说明
当你调用entropy(h1, h2, h3)时,match.call()会返回entropy(h1, h2, h3)这个语言对象,我们从中取出...对应的部分(也就是h1、h2、h3这三个表达式),再用deparse()把每个表达式转换成字符串,就得到了你要的参数名称。
甚至如果传入的是复杂表达式,比如entropy(mean(h1), sum(h2)),它也能正确返回"mean(h1)"和"sum(h2)",完全符合实际传入的内容。
方法2:结合substitute()和alist()处理参数
如果你需要更精细地处理命名参数和未命名参数的情况,可以用这个方式:
entropy <- function(...) { # 将`...`转换为参数列表 arg_list <- alist(...) arg_names <- names(arg_list) # 遍历参数,补全未命名参数的名称 for (i in seq_along(arg_list)) { if (is.null(arg_names[i]) || arg_names[i] == "") { arg_names[i] <- deparse(substitute(...)[[i]]) } } return(arg_names) } # 测试混合场景 entropy(h1, custom_arg = h2, h3) # 输出:[1] "h1" "custom_arg" "h3"
这个方法能同时处理未命名变量和命名参数的情况,比如上面的测试中,命名参数custom_arg会被直接保留名称,未命名的h1、h3则会被提取变量名。
总结
核心逻辑就是:不要盯着函数定义时的形参(formalArgs()/formals()的作用范围),而是去捕获调用时刻的实际参数表达式——match.call()是最直接的工具,大部分场景下用方法1就足够解决问题啦。
内容的提问来源于stack exchange,提问作者HHH
相关产品推荐
相关产品推荐

