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)
如果我分别提取列,那么它适用于map2和exec
map2(sim$f, sim$params, function(fn, args) exec(fn, !!!args, n = 10))
Run Code Online (Sandbox Code Playgroud)
但是,我不能让mutate工作与map2和exec
sim %>%
mutate(sim = map2(f, params, function(fn, args) exec(fn, !!!args, n = 10)))
Run Code Online (Sandbox Code Playgroud)
我收到错误“错误:无法拼接类型闭包的对象,因为它不是向量”
有人能帮忙吗?
运算!!!符优先于匿名函数的创建。因此,它会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)