函数,该函数指定另一个函数的参数以及要用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

(purr
map
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