将 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 函数的初始化。
这似乎是个愚蠢的问题,但我终究无法弄明白,因此非常感谢您的帮助。
我正在尝试将 .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 函数的初始化。