使用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)
代码说明
- 参数配对:固定参数
scale和shape需要用rep()生成与df1长度一致的向量,确保pmap能将每个国家的mode、min、max和对应的固定参数一一配对。 - 直接传递函数:因为列表的参数名(
mode、min、max、scale、shape)与bv_psi的参数名完全匹配,所以可以直接传入bv_psi作为函数,无需手动用~bv_psi(..1,..2,..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
相关产品推荐
相关产品推荐

