You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用purrr的pmap对三个列表批量应用bv_psi函数遇问题求助

问题说明

我有一个列表形式的数据集df1,先用以下代码生成了mins和maxs两个列表:

library(tidyverse)
library(purrr)
library(BVAR)
mins <- map(df1, ~ .x / 100)
maxs <- map(df1, ~ .x * 100)

现在想使用purrr包的pmap函数,批量将bv_psi函数应用到df1、mins、maxs这三个列表上,但下面的代码无法正常运行:

pmap(
  list(
    mode = df1,
    min = mins,
    max = maxs
    # scale = 0.004,
    # shape = 0.004
  ),
  ~bv_psi(..1, ..2, ..3)
  )

期望实现的效果是对所有列执行类似bv_psi(scale = 0.004, shape = 0.004, mode = df1元素, min = mins元素, max = maxs元素)的操作,示例输出如下:

Shape / Scale: 0.004 / 0.004
#1 Mode / Bounds: 0.0000000001 / [0.000000000001, 0.00000001]
#2 Mode / Bounds: 2.329554 / [0.02329554, 232.9554]
#3 Mode / Bounds: 0.3086792 / [0.003086792, 30.86792]
#4 Mode / Bounds: 0.289515 / [0.00289515, 28.9515]
#5 Mode / Bounds: 0.3444753 / [0.003444753, 34.44753]

数据集如下:

df1 <- list(FRA = c(var1 = 0.348484926831081, var2 = 2.32955373143543, 
var3 = 0.308679204532957, var4 = 0.242541092355223, var5 = 0.344475341669246
), ITA = c(var1 = 0.348484926831081, var2 = 2.26657313151514, 
var3 = 0.34565008444245, var4 = 0.242541092355223, var5 = 0.403082188649582
), NOR = c(var2 = 1.20962811046986, var3 = 0.289000898298659, 
var4 = 0.242541092355223, var5 = 0.34539772064608), SPA = c(var1 = 0.348484926831081, 
var2 = 2.59042002848148, var3 = 0.748413615669766, var4 = 0.242541092355223, 
var5 = 0.403082188649582), GER = c(var1 = 0.350388888258007, 
var2 = 1.58267709209138, var3 = 0.230489915987761, var4 = 0.243815124309394, 
var5 = 0.332742111113146))
解决方案

你的代码问题在于pmap接收的参数结构不对:df1、mins、maxs都是包含多个向量的列表,而pmap需要将每个国家对应的mode、min、max以及固定参数scale、shape按组配对,才能正确批量调用bv_psi。

修正后的代码(简洁版)

pmap(
  list(
    mode = df1,
    min = mins,
    max = maxs,
    scale = rep(0.004, length(df1)),
    shape = rep(0.004, length(df1))
  ),
  bv_psi
) %>% purrr::walk(print)

代码说明

  1. 参数配对:固定参数scale和shape需要用rep()生成与df1长度一致的向量,确保pmap能将每个国家的mode、min、max和对应的固定参数一一配对。
  2. 直接传递函数:因为列表的参数名(mode、min、max、scale、shape)与bv_psi的参数名完全匹配,所以可以直接传入bv_psi作为函数,无需手动用~bv_psi(..1,..2,..3)指定参数顺序。
  3. 输出格式匹配:用walk(print)遍历结果并打印,就能得到你示例中的输出格式。

另一种写法(分步清晰版)

如果需要更清晰的分步逻辑,可以先把每组参数打包成列表,再批量调用:

# 打包每组参数
param_list <- pmap(
  list(df1, mins, maxs),
  function(mode_val, min_val, max_val) {
    list(
      mode = mode_val,
      min = min_val,
      max = max_val,
      scale = 0.004,
      shape = 0.004
    )
  }
)

# 批量调用并打印
param_list %>% pmap(bv_psi) %>% walk(print)

内容的提问来源于stack exchange,提问作者user113156

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:50:19