如何在R原生管道|>中结合mutate使用purrr::pmap?
在R原生管道
|>中结合pmap的可行方案 问题核心
R原生管道|>不支持像magrittr的%>%那样,用_在函数内部参数中直接指代管道输入,这是原代码报错的根本原因。以下是几种适配原生管道的可行方案:
方案1:显式传入目标列组成的列表
直接将pmap需要处理的列打包成列表作为第一个参数,逻辑和map2完全一致,扩展到三参数及以上时,只需在列表中添加对应列即可:
library(tidyverse) Z <- tibble(x = list(sample(10, size = 2), sample(10, size = 3)), fn = c(max, min)) Z |> mutate( msg2 = map2_chr(x, fn, \(x, fn) paste(toString(x), '->', fn(x))), msgp = pmap_chr(list(x, fn), \(x, fn) paste(toString(x), '->', fn(x))) )
方案2:使用cur_data()获取当前行数据
借助dplyr的cur_data()函数,它会返回当前行的数据集,完美替代%>%中的\.占位符:
Z |> mutate( msg2 = map2_chr(x, fn, \(x, fn) paste(toString(x), '->', fn(x))), msgp = pmap_chr(cur_data(), \(x, fn) paste(toString(x), '->', fn(x))) )
方案3:行级分组配合do.call(无需pmap)
如果仅需处理行内多参数函数调用,可以先按行分组,用do.call直接调用目标函数,避免使用pmap:
Z |> rowwise() |> mutate( msg2 = map2_chr(x, fn, \(x, fn) paste(toString(x), '->', fn(x))), msgp = paste(toString(x), '->', do.call(fn, list(x))) ) |> ungroup()
管道选择建议
- 若你的工作流频繁需要在函数内部引用管道输入(比如
mutate中直接调用整个数据集),magrittr的%>%占位符语法更灵活,无需大幅改动代码; - 若追求原生兼容性、轻量无额外依赖,推荐使用上述适配原生管道
|>的方案,它是R核心功能,无需加载第三方包。
内容的提问来源于stack exchange,提问作者banbh
相关产品推荐
相关产品推荐

