如何在R函数中处理列表时保留元素为符号而非求值结果?
解决方案
核心问题在于:当你定义external <- list(a = mean, foo = sum)时,mean和sum已经被R求值为对应的函数对象,此时external的元素是函数,原始的符号信息已经丢失,无法从这个已求值的列表恢复出原来的符号。要实现需求,必须通过保留未求值的表达式来操作。
以下分两种场景给出实现方案:
场景1:直接传递列表表达式给函数
Base R 实现
foo <- function(x) { # 获取未求值的参数表达式 expr_list <- substitute(x) # 提取列表中的元素(跳过第一个元素`list`) lapply(expr_list[-1], identity) } # 调用示例 foo(list(a = mean, foo = sum)) # 输出结果: # $a # mean # # $foo # sum
rlang 实现
library(rlang) foo <- function(x) { # 获取未求值的参数表达式 expr_list <- enexpr(x) # 提取列表元素 map(expr_list[-1], identity) } # 调用示例 foo(list(a = mean, foo = sum)) # 输出结果: # $a # mean # # $foo # sum
场景2:提前定义保存未求值表达式的变量
如果你需要先将目标列表结构存储为变量,需要用quote()(Base R)或expr()(rlang)保存未求值的表达式:
Base R 实现
# 用quote保存未求值的列表表达式 external <- quote(list(a = mean, foo = sum)) foo <- function(x) { # 获取变量对应的表达式 expr_list <- eval(substitute(x)) lapply(expr_list[-1], identity) } # 调用示例 foo(external) # 输出结果: # $a # mean # # $foo # sum
rlang 实现
library(rlang) # 用expr保存未求值的列表表达式 external <- expr(list(a = mean, foo = sum)) foo <- function(x) { # 解析变量对应的未求值列表表达式 expr_list <- eval_tidy(enexpr(x)) map(expr_list[-1], identity) } # 调用示例 foo(external) # 输出结果: # $a # mean # # $foo # sum
内容的提问来源于stack exchange,提问作者bretauv
相关产品推荐
相关产品推荐

