如何修复R语言myexplist函数无法生成表达式列表的问题?
修复方案
问题原因
你的原函数myexplist <- function(a,b,c,...) list(...)中,a,b,c是显式定义的正式参数,调用时传入的a=4,b=a**2,c=a**3会被优先匹配到这些参数上,...仅用来接收未在函数定义中声明的额外参数,所以list(...)自然返回空列表。同时R默认会对函数参数求值,你需要保留原始表达式而非计算结果,这也需要特殊处理。
修复方法
方法1:支持任意数量参数(灵活版)
修改函数,通过match.call()捕获调用时的所有参数表达式:
myexplist <- function(...) { # 获取调用时的参数列表(去除函数名) as.list(match.call()[-1]) }
调用测试:
myexplist(a=4, b=a**2, c=a**3)
输出结果:
$a [1] 4 $b a**2 $c a**3
方法2:固定参数(明确版)
如果你的函数只需要处理a,b,c三个参数,可以直接用substitute()捕获每个参数的原始表达式:
myexplist <- function(a, b, c) { list( a = substitute(a), b = substitute(b), c = substitute(c) ) }
同样能得到你预期的输出。
原理说明
match.call()会完整记录函数被调用时的表达式,[-1]用来剔除函数名本身,剩下的就是所有传入的参数及其原始表达式。substitute()可以捕获参数传入时的未求值表达式,而不是计算后的结果,刚好满足你保留a**2这类表达式的需求。
内容的提问来源于stack exchange,提问作者SAL
相关产品推荐
相关产品推荐

