R语言中如何对单个向量同时计算多个函数的返回值
方案1:管道+大括号手动指定输入
这是最贴近你原有写法的改造方案,magrittr管道(%>%)和R4.1+原生管道(|>)都支持该用法,你可以在大括号内同时调用任意数量的函数,用.指代传入的向量:
library(magrittr) vec1 <- rnorm(100) # 返回命名向量 res <- vec1 %>% { c( sd = sd(.), mean = mean(.), median = median(.), min = min(.) ) } # 如果需要不同长度的返回值,换成list即可 res_list <- vec1 %>% { list( sd = sd(.), mean = mean(.), quantile = quantile(., c(0.25, 0.5, 0.75)) ) }
方案2:纯Base R无依赖实现
不需要加载任何第三方包,直接把待调用的函数存入列表后用sapply/lapply批量执行:
vec1 <- rnorm(100) # 定义要执行的函数列表,命名会自动同步到结果中 calc_funcs <- list(sd = sd, mean = mean, median = median) # 批量执行,返回命名向量 res <- sapply(calc_funcs, function(f) f(vec1)) # R4.1+可以用简写的匿名函数 res <- sapply(calc_funcs, \(f) f(vec1))
方案3:purrr包函数式批量调用
如果你的项目已经在使用tidyverse生态,可以用purrr的map系列函数实现更规范的批量计算:
library(purrr) vec1 <- rnorm(100) # 返回数值型向量 res <- map_dbl(list(sd = sd, mean = mean), ~.x(vec1)) # 支持多类型返回值 res <- map(list(sd = sd, quantile = ~quantile(.x, c(0.25,0.75))), ~.x(vec1))
原有写法报错原因
管道默认会将左侧的输出作为右侧第一个函数的首个参数,你写的逗号分隔写法不符合管道语法规则,相当于单独执行了无参数的mean(),自然无法得到预期结果。
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

