使用purrr::pmap与其他默认输入参数

5

我想知道如果我有三个以上的输入参数需要映射到一个带有其他默认输入的函数中,该如何使用pmap()函数。

以下是一个可重现的示例:

a=c(5, 100, 900)
b=c(1, 2, 3)
ablist=list(mean=a,sd=b)
pmap(ablist, ~rnorm( mean=a , sd=b , n = 9))

输出:

 [[1]]
 [1]   5.734723  99.883171 895.962561   5.346905  98.723191 903.373177   4.172267  96.424440 897.437970

 [[2]]
 [1]   4.427977  98.348139 899.287248   4.404674  99.178516 900.983974   3.836353 101.520355 899.992332

 [[3]]
 [1]   4.961772  95.927525 899.096313   4.444354 101.694591 904.172462   6.231246  97.773325 897.611838

但是你可以看到,输出结果没有按照向量中的meansd顺序进行映射。

我希望使用rnorm(mean=5,sd=1,n=9)等方式得到[[1]]。出于好奇,我想知道pmap()在这个示例中是如何工作的。

顺便说一下,我知道在这个示例中,我可以轻松使用map2(),但是在我的实际代码中,我有10个输入,所以需要使用pmap()

提前感谢任何回复!

1个回答

7

当您使用pmap时,可以使用..1..2等来引用参数。这样可以得到您想要的结果:

pmap(ablist, ~rnorm(mean = ..1, sd = ..2, n = 9))

或者,您可以提供一个包含所有参数的命名列表。这也可以正常工作:

abclist = list(
  mean = c(5, 100, 900),
  sd = c(1, 2, 3), 
  n = rep(9, 3)
)

pmap(abclist, rnorm)

您的代码只是运行了rnorm(mean = c(5, 100, 900), sd = c(1, 2, 3), n = 9)三次并将其存储在列表中。


1
哇!太棒了!它能用了!非常感谢你的帮助!不过,pmap() 很难理解。有什么快速学习的建议吗? - Joanna
3
你也可以使用 pmap(ablist, rnorm, n = 9),因为 pmap 使用 ... 来收集其他参数以传递到 .f - Jake Kaupp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接