在R中控制pmap输出顺序,实现额外信息与模型摘要逐次绑定
问题根源
你原有代码的输出错位是因为:cat()语句会在迭代运行时实时输出到控制台,而summary(model)是作为函数返回值被pmap统一收集,等所有迭代执行完成后才会集中打印所有返回结果,因此两类内容会分开展示。
解决方案
方案1:整合返回值(推荐,方便后续调用数据)
将额外信息和模型摘要封装为同一个列表对象返回,pmap返回的结果中每个元素都会同时包含两类内容,打印时自然成对展示:
library(purrr) # 构造变量 y1 <- c(runif(20, 0, 1)) y2 <- c(runif(20, 0, 1)) x1 <- c(rnorm(20, 0, 1)) x2 <- c(rnorm(20, 0, 1)) # 变量打包为列表 ys <- list(y1, y2) xs <- list(x1, x2) # 修改后的回归函数 regressor <- function(y, x){ # 计算额外信息 mean_y <- mean(y) # 拟合模型生成摘要 model <- lm(y ~ x) model_summary <- summary(model) # 两类信息整合为单个对象返回 return(list( `data` = mean_y, `模型摘要` = model_summary )) } # 批量运行 result <- pmap(list(ys, xs), regressor) # 打印结果即可得到成对输出 print(result)
方案2:函数内直接打印(完全匹配你期望的输出格式)
如果不需要保留后续计算用的数据,仅需要输出展示,可以将两类内容的打印逻辑都放到函数内部,使用pwalk迭代执行即可:
regressor <- function(y, x){ # 先打印额外信息 mean_y <- mean(y) cat("data:", mean_y, "\n\n") # 再打印模型摘要 model <- lm(y ~ x) print(summary(model)) # 可选:加分隔符区分不同模型 cat("\n", rep("-", 60), "\n\n", sep = "") } # pwalk仅迭代执行,不需要收集返回值 pwalk(list(ys, xs), regressor)
内容的提问来源于stack exchange,提问作者Mackson Ncube
相关产品推荐
相关产品推荐

