如何用Base R编写函数捕获Ellipsis,无需大括号返回未求值表达式列表
实现无需大括号的表达式捕获函数fun2
要实现fun2,核心是捕获...中的每个未求值表达式,再将它们逐一包装成大括号包裹的形式,具体代码如下:
fun2 <- function(...) { # 捕获...中的所有未求值表达式,转为列表 raw_exprs <- as.list(substitute(list(...)))[-1L] # 遍历每个表达式,用大括号包裹 lapply(raw_exprs, function(expr) call("{", expr)) }
测试调用效果:
fun2(a = 2, a2 = a * 2) # [[1]] # { # a = 2 # } # # [[2]] # { # a2 = a * 2 # }
代码说明
substitute(list(...))会将...中的参数以未求值的形式打包成一个列表表达式,as.list(...)转为列表后,[-1L]去掉列表本身的头部(即list这个符号),得到每个传入的原始表达式。lapply遍历每个原始表达式,用call("{", expr)构造一个大括号包裹的调用表达式,最终返回的列表就和fun1的输出完全一致。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

