如何在R函数中通过动态指定变量名返回多个值?
问题:动态返回函数内多个变量的值
我需要编写一个函数,它会生成多个存储计算值的对象,希望能返回所有这些值。实际场景中对象数量会随数据变化,因此我想创建一个包含需返回对象名称的向量,通过求值该向量让函数返回所有对象。
演示代码如下:
v1=runif(50) takemean1=function(x){ avg=mean(x) std=sd(x) return(c(avg,std)) } text=c("avg","std") takemean2=function(x){ avg=mean(x) std=sd(x) return(c(eval(parse(text=noquote(paste(text)))))) } takemean1(v1) takemean2(v1)
takemean1能输出预期结果,但takemean2仅返回std,未返回avg,请问如何调整让takemean2和takemean1输出一致?
解决方法
问题出在paste(text)会把向量c("avg","std")合并成单个字符串"avg std",经过parse后变成一个表达式,eval执行时只会返回表达式里最后一个变量的值(也就是std)。要返回所有变量,需要逐个处理向量中的每个元素,或者直接批量获取变量值。
方法1:用sapply逐个求值变量
修改后的takemean2函数:
takemean2=function(x){ avg=mean(x) std=sd(x) return(sapply(text, function(var) eval(parse(text=var)))) }
方法2:用mget批量获取变量(更简洁)
mget可以直接根据变量名称向量,从当前环境中获取对应的变量值,再用unlist转成向量:
takemean2=function(x){ avg=mean(x) std=sd(x) return(unlist(mget(text))) }
修改后运行takemean1(v1)和takemean2(v1),两者输出结果完全一致。
内容的提问来源于stack exchange,提问作者user3806834
相关产品推荐
相关产品推荐

