如何在R中编写接收任意对象的函数,返回存在对象列表并对缺失对象告警
R函数实现:接收任意对象,返回存在的对象列表并警告缺失对象
问题原因
你原来的思路无法生效是因为list(...)会先对所有传入的参数强制求值,R在执行函数内部逻辑前就会尝试查找所有传入的对象,找不到就直接触发报错,没有机会执行后续的存在性判断。
实现思路
核心是先捕获未求值的输入参数符号,再逐个在调用环境中判断对象是否存在,仅对存在的对象求值加入结果列表,对不存在的对象输出警告。
实现代码
f <- function(...) { # 捕获所有未求值的输入参数,去掉list()本身的符号 arg_symbols <- substitute(list(...))[-1] # 获取函数调用的父环境,作为对象查找的上下文 call_env <- parent.frame() result <- list() for (idx in seq_along(arg_symbols)) { obj_name <- as.character(arg_symbols[[idx]]) if (exists(obj_name, envir = call_env)) { result[[obj_name]] <- get(obj_name, envir = call_env) } else { warning(sprintf("对象 '%s' 不存在,已跳过", obj_name), call. = FALSE) } } return(result) }
测试验证
首先准备测试数据:
a <- data.frame(A = 1:2) b <- 4 c <- list(5,4,3)
正常传入存在的对象
f(a, b, c)
返回结果:
$a A 1 1 2 2 $b [1] 4 $c $c[[1]] [1] 5 $c[[2]] [1] 4 $c[[3]] [1] 3
传入不存在的对象d
f(a, b, c, d)
输出警告:
警告信息: 对象 'd' 不存在,已跳过
返回结果和f(a,b,c)完全一致,仅包含存在的三个对象。
内容的提问来源于stack exchange,提问作者JCran
相关产品推荐
相关产品推荐

