当前位置:  开发笔记 > 前端 > 正文

R purrr ::: pmap:如何按名称引用输入参数?

如何解决《Rpurrr:::pmap:如何按名称引用输入参数?》经验,为你挑选了2个好方法。

purrr:::pmap用三个输入R.目前尚不清楚我如何在公式调用中明确引用这些输入?使用map2时,公式调用如下~ .x + .y.但使用时该怎么办pmap

从http://r4ds.had.co.nz/lists.html转载Hadley的例子

library(purrr)
mu <- list(5, 10, -3)
sigma <- list(1, 5, 10)
n <- list(1, 3, 5)

args2 <- list(mean = mu, sd = sigma, n = n)
pmap(args2, rnorm)

如果我想在调用时显式引用输入参数rnorm,我可以使用:

pmap(args2, function(mean, sd, n) rnorm(n, mean, sd))

但是说我想用公式方法做到这一点.我怎么做?例如,这不起作用:

pmap(args2, ~rnorm(n=.n, mean=.mean, sd=.sd))

谢谢!!



1> Aurèle..:

由于版本0.2.3,您可以使用..1,..2,..3等:

pmap(args2, ~ rnorm(..3, ..1, ..2))

但是......我已经遇到了这种语法的麻烦,例如replicate:

pmap(list(1, 2), ~ replicate(n = ..1, expr = ..2))
# Error in FUN(X[[i]], ...) : the ... list does not contain 2 elements

可能是因为:

print(replicate)
# function (n, expr, simplify = "array") 
#   sapply(integer(n), eval.parent(substitute(function(...) expr)), 
#          simplify = simplify)

似乎function(...) exprin substitute()不能很好地..2被解释为第二个元素...是空的.

请注意,pmap(list(1, 2), ~ replicate(n = ..1, expr = .y))仍然有效.



2> Moody_Mudski..:

你可以with(...)用来解决这个问题:

pmap(args2, ~with(list(...),rnorm(n, mean, sd)))
# [[1]]
# [1] 2.733528
# 
# [[2]]
# [1] 4.0967533 6.4926143 0.6083532
# 
# [[3]]
# [1]  1.8836592 -0.2090425 -4.0030168  1.1834931  3.2771316

这里有更多解释:利用purrr :: pmap利用.f列表名称

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有