首页 > 解决方案 > 将 mutate 与 map2 和 exec 一起使用,而不是 invoke_map

问题描述

“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))

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

map2(sim$f, sim$params, function(fn, args) exec(fn, !!!args, n = 10))

但是,我无法mutatemap2exec

sim %>% 
  mutate(sim = map2(f, params, function(fn, args) exec(fn, !!!args, n = 10)))

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

有人能帮忙吗?

标签: rdplyrtidyversepurrrrlang

解决方案


!!!运算符优先于匿名函数的创建。因此,它会args 立即在数据框的范围内进行评估,如果没有找到这样的列,则会在全局范围内进行评估。一种解决方案是将函数定义移到map2调用之外:

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

sim %>% 
  mutate(sim = map2(f, params, myfun))        # Now works

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

sim %>%
    mutate(temp = map2(f, params, c, n=10),
           sim  = map(temp, lift(exec)),
           temp = NULL)

推荐阅读