我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))
谢谢!!
由于版本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(...) expr
in substitute()
不能很好地..2
被解释为第二个元素...
是空的.
请注意,pmap(list(1, 2), ~ replicate(n = ..1, expr = .y))
仍然有效.
你可以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列表名称