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

时间:2017-01-26 02:47:04

标签: r purrr tidyverse

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

http://r4ds.had.co.nz/lists.html

再现哈德利的例子
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))

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以使用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

此处有更多说明:Harnessing .f list names with purrr::pmap

答案 1 :(得分:3)

似乎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),最好的办法是:

  1. 未列出列表中的元素
  2. 不要使用两个以上的参数(为了使用隐式名称.x.y
  3. 您可以这样使用,因此可以修复您想要的第三个参数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))
    

    将返回:

    [[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