将 mutate 与 map2 和 exec 一起使用,而不是 invoke_map

sta*_*101 5 r dplyr purrr tidyverse rlang

“R for Data Science”中的这个例子使用了invoke_map现在已停用。

sim <- tribble(
  ~f, ~params,
  "runif", list(min = -1, max = 1),
  "rnorm", list(sd = 5),
  "rpois", list(lambda = 10)
)

sim %>% 
  mutate(sim = invoke_map(f, params, n = 10))
Run Code Online (Sandbox Code Playgroud)

如果我分别提取列,那么它适用于map2exec

map2(sim$f, sim$params, function(fn, args) exec(fn, !!!args, n = 10))
Run Code Online (Sandbox Code Playgroud)

但是,我不能让mutate工作与map2exec

sim %>% 
  mutate(sim = map2(f, params, function(fn, args) exec(fn, !!!args, n = 10)))
Run Code Online (Sandbox Code Playgroud)

我收到错误“错误:无法拼接类型闭包的对象,因为它不是向量”

有人能帮忙吗?

Art*_*lov 3

运算!!!符优先于匿名函数的创建。因此,它会args 立即在数据框的范围内进行评估,并且当它找不到此类列时,会在全局范围内进行评估。一种解决方案是将函数定义移到调用之外map2

myfun <- function(fn, args) exec(fn, !!!args, n = 10)

sim %>% 
  mutate(sim = map2(f, params, myfun))        # Now works
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是将函数名称和所有参数连接到一个列表中,然后将该列表传递给exec域提升

sim %>%
    mutate(temp = map2(f, params, c, n=10),
           sim  = map(temp, lift(exec)),
           temp = NULL)
Run Code Online (Sandbox Code Playgroud)