You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R原生管道|>搭配purrr::map_dfr()使用的两个问题

问题1解决方案

你报错的核心原因是多余书写了匿名函数末尾的调用括号():{\(p) ... }()的写法会在定义函数的同时立即执行,但你没有给这个调用传入参数,自然触发「参数p缺失」的报错。
purrr::map_dfr的.f参数只需要接收函数定义本身,不需要你主动调用,正确写法如下:

csvs |> 
  purrr::map_dfr(
    .f = \(p) readr::read_csv(
      file = I(p),
      col_types = col_types
    )
  )

还可以进一步简写,不需要外层的大括号:

csvs |> purrr::map_dfr(\(p) readr::read_csv(I(p), col_types = col_types))

问题2解决方案

你得到翻倍行数的核心原因是遍历逻辑出错:你在.f的公式中传入了I(p),这里的p是整个csvs字符串向量,不是当前遍历到的单个csv字符串。相当于每次遍历都读取了所有csv内容,多次遍历就得到了多倍行数。
原生管道默认只能把左侧值传递给右侧函数的第一个参数,你如果要模仿magrittr的占位符写法,不需要额外套一层全局匿名函数,直接在.f参数内用purrr的公式语法即可,正确写法如下:

csvs |> 
  purrr::map_dfr(
    .f = ~ readr::read_csv(
      file = I(.),
      col_types = col_types
    )
  )

如果你一定要用外层匿名函数的写法,需要区分外层传入的整个向量和内层遍历的单个元素:

csvs |> 
  {\(all_csvs)
    purrr::map_dfr(
      .x = all_csvs,
      .f = ~ readr::read_csv(
        file = I(.),
        col_types = col_types
      )
    )
  }()

补充说明:给file参数包裹I()是为了避免readr版本更新后的兼容问题,当前版本不加也可正常运行;如果传入的是常规文件路径而非字面量字符串,请移除I()调用。


内容的提问来源于stack exchange,提问作者wibeasley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 06:45:05