R purrr:::pmap:如何按名称引用输入参数?
R purrr:::pmap: how to refer to input arguments by name?
我正在使用具有三个输入的 R purrr:::pmap
。目前尚不清楚如何在 formula 调用中明确引用这些输入?使用 map2 时,formula 调用会变成 ~ .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))
谢谢!!
似乎 pmap
无法通过公式界面中的名称访问列表中的参数。
您可以签到 https://github.com/hadley/purrr/issues/203。
例如你可以这样做:
pmap(list(1:2, 5:6), ~ .x + .y)
因此列表的第一个元素由 .x
引用,第二个元素由 .y
引用。
但是,如果您尝试将列表的参数命名为
pmap(list(a = 1:2, b = 5:6), ~ .a + .b)
那么你会报错:
Error in .f(a = .l[[c(1L, i)]], b = .l[[c(2L, i)]], ...) :
unused arguments (a = .l[[c(1, i)]], b = .l[[c(2, i)]])
我认为在函数 pmap
的公式界面中,如果您想使用公式界面而不使用 function(mean , sd, n)
,您可以做的最好的事情是:
- 不命名列表中的元素
- 不要使用两个以上的参数(为了使用隐式名称
.x
和 .y
)
因此,您可以使用 thus fix 您想要的第三个参数 n
(例如 n = 4
)的值,然后 运行:
mu <- list(5, 10, -3)
sigma <- list(1, 5, 10)
set.seed(1)
pmap(list(mu,sigma), ~ rnorm(mean = .x, sd = .y, n = 4))
哪个 return :
[[1]]
[1] 4.373546 5.183643 4.164371 6.595281
[[2]]
[1] 11.647539 5.897658 12.437145 13.691624
[[3]]
[1] 2.7578135 -6.0538839 12.1178117 0.8984324
[[4]]
[1] 9.136278 4.355900 14.374793 10.865199
由于 version 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)
似乎substitute()
中的function(...) expr
与..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
这里有更多解释:
我正在使用具有三个输入的 R purrr:::pmap
。目前尚不清楚如何在 formula 调用中明确引用这些输入?使用 map2 时,formula 调用会变成 ~ .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))
谢谢!!
似乎 pmap
无法通过公式界面中的名称访问列表中的参数。
您可以签到 https://github.com/hadley/purrr/issues/203。
例如你可以这样做:
pmap(list(1:2, 5:6), ~ .x + .y)
因此列表的第一个元素由 .x
引用,第二个元素由 .y
引用。
但是,如果您尝试将列表的参数命名为
pmap(list(a = 1:2, b = 5:6), ~ .a + .b)
那么你会报错:
Error in .f(a = .l[[c(1L, i)]], b = .l[[c(2L, i)]], ...) :
unused arguments (a = .l[[c(1, i)]], b = .l[[c(2, i)]])
我认为在函数 pmap
的公式界面中,如果您想使用公式界面而不使用 function(mean , sd, n)
,您可以做的最好的事情是:
- 不命名列表中的元素
- 不要使用两个以上的参数(为了使用隐式名称
.x
和.y
)
因此,您可以使用 thus fix 您想要的第三个参数 n
(例如 n = 4
)的值,然后 运行:
mu <- list(5, 10, -3)
sigma <- list(1, 5, 10)
set.seed(1)
pmap(list(mu,sigma), ~ rnorm(mean = .x, sd = .y, n = 4))
哪个 return :
[[1]]
[1] 4.373546 5.183643 4.164371 6.595281
[[2]]
[1] 11.647539 5.897658 12.437145 13.691624
[[3]]
[1] 2.7578135 -6.0538839 12.1178117 0.8984324
[[4]]
[1] 9.136278 4.355900 14.374793 10.865199
由于 version 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)
似乎substitute()
中的function(...) expr
与..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
这里有更多解释: