函数,该函数指定另一个函数的参数以及要用purr::map或lappy传递给该参数的值列表
假设我有一个简单的函数:函数,该函数指定另一个函数的参数以及要用purr::map或lappy传递给该参数的值列表,r,functional-programming,tidyverse,purrr,R,Functional Programming,Tidyverse,Purrr,假设我有一个简单的函数: my_c <- function(x = 1, y = 2, z = 3) { c(x, y, z) } 我尝试解析表达式,但不起作用: library(tidyverse) vary_my_c <- function(vary, values, ...) { values %>% map(function(param) { my_c(eval(parse(text = str_c(vary, "= param")))) }) }
my_c <- function(x = 1, y = 2, z = 3) {
c(x, y, z)
}
我尝试解析表达式,但不起作用:
library(tidyverse)
vary_my_c <- function(vary, values, ...) {
values %>% map(function(param) {
my_c(eval(parse(text = str_c(vary, "= param"))))
})
}
# or equivalently with syntactic sugar:
vary_my_c <- function(vary, values, ...) {
values %>% map(~ my_c(eval(parse(text = str_c(vary, "= .x")))))
}
# gives:
[[1]]
[1] 10 2 3
[[2]]
[1] 11 2 3
库(tidyverse)
更改我的%map(函数(参数){
my_c(eval(parse(text=str_c(vary,“=param”)))
})
}
#或等同于语法糖:
vary_my_c%map(~my_c(eval(parse)(text=str_c(vary,=.x“)))))
}
#给出:
[[1]]
[1] 10 2 3
[[2]]
[1] 11 2 3
我想知道解决方案是否涉及
rlang::enquo()
和
而不是eval(parse(text=text))
,但我对准旋转不太熟悉,不知道如何测试它。如果将以my_c
开头的行替换为:
eval(parse(text = sprintf("my_c(%s = %s)", vary, param)))
虽然这样做可行,但我建议改为使用Map
和do.call
。不需要软件包,也不使用eval
(purrmap
和invoke
代替map
和do.call
可以与参数的适当重新排列交替使用。不需要准引号。)
eval(parse(text = sprintf("my_c(%s = %s)", vary, param)))
vary_my_c <- function(vary, values) {
Map(function(value) do.call(my_c, setNames(list(value), vary)), values)
}
vary_my_c(vary = "y", values = c(10, 11))
[[1]]
[1] 1 10 3
[[2]]
[1] 1 11 3