R中结合管道使用purrr迭代多个对象时map2报错如何解决?
问题原因
- 调用
map2时参数名匹配错误:map2的第二个可迭代参数为.y,代码中写的y = title无法匹配到该参数,会被识别为额外参数归入...,导致map2的.y、.f参数均被判定为未赋值,因此抛出.f缺失的报错。 - 存在参数重名的潜在风险:
across的匿名函数中使用.x作为参数名,和外层map2公式语法的.x重名,低版本purrr可能出现作用域识别异常。
正确实现方案
基础版(适配当前需求)
建议优先用walk2替代map2,画图属于副作用操作,不需要返回列表存储ggplot对象,更符合语法规范:
library(tidyverse) # 修正示例数据的列表赋值(原写法用<-不会给列表元素命名,建议用=) my_list <- list( df_1 = tibble(a = 1:10, b = 1:10), df_2 = tibble(a = 1:10, b = 10:1) ) title <- c("Up", "Down") # 正确的walk2写法,管道传入第一个参数.x,第二个位置直接传title作为.y my_list %>% walk2(title, ~{ .x %>% mutate(across(everything(), `*`, 10)) %>% # 直接传入运算符避免匿名函数重名 ggplot(aes(a, b)) + geom_line() + ggtitle(.y) })
如果需要保留生成的ggplot对象到列表中,把walk2替换为map2即可。
扩展到多参数的pmap场景
如果需要传入3个及以上的参数,只需要把所有可迭代参数整理成一个等长的列表,调用pmap/pwalk即可,参数可以通过..1/..2/..3按顺序匹配,也可以用命名参数匹配,扩展性极强,示例:
# 新增第三个参数:每张图的线条颜色 color_vec <- c("darkred", "darkblue") # 整理所有参数到列表 param_list <- list( df = my_list, title = title, line_color = color_vec ) # 调用pwalk实现多参数遍历 param_list %>% pwalk(~{ # ..1对应param_list第一个元素df,..2对应title,..3对应line_color ..1 %>% mutate(across(everything(), `*`, 10)) %>% ggplot(aes(a, b)) + geom_line(color = ..3, linewidth = 1) + ggtitle(..2) })
内容的提问来源于stack exchange,提问作者Rasul89
相关产品推荐
相关产品推荐

