将 map() .x 传递给函数

Passing map() .x to a function

这似乎是个愚蠢的问题,但我终究无法弄明白,因此非常感谢您的帮助。

我正在尝试将 .x(来自 purrr::map)传递给一个函数,所以最后我得到了一个函数列表(我最终将使用它来传递一个包含函数的列定义列表到反应)。这是我想要做的一个非常基本的例子:

a = list("b", "c")

t <- map(a, ~{
  function(.x){
    print(x)
  }
})

我要找的结果是:

> t
[[1]]
function(b){
    print(x)
  }

[[2]]
function(c){
    print(x)
  }

但我得到:

> t
[[1]]
function(.x){
    print(x)
  }

[[2]]
function(.x){
    print(x)
  }

我正在寻找的可能吗?

你可以通过使用包装函数来创建一个新函数来获得你想要的。在包装器中,创建一个空函数,将 args 设置为传入的值 x(因此如果 x="a",则给出 alist(a=) 的等价物),然后还解析一个字符串以body。那么返回的列表就是你想要的函数。

library(purrr)

function_crafter <- function(x) {
  f <- function() {}
  args <- setNames(list(bquote()), x)
  formals(f) <- args
  body(f) <- parse(text = paste0("print(", x, ")"))
  f
}

a <- list("b", "c")

fl <- map(a, function_crafter)

fl[[1]](b=2)
#> [1] 2
fl[[2]](c=39)
#> [1] 39

fl
#> [[1]]
#> function (b) 
#> print(b)
#> <environment: 0x7fb68752aae0>
#> 
#> [[2]]
#> function (c) 
#> print(c)
#> <environment: 0x7fb687552818>

如果你真的希望每个函数中的 print() 只是 print(x) 而不是 print(b)print(c),那么这更容易,只需定义 body 函数的初始化。