【问题标题】:Native pipe with purrr::map_dfr()带有 purrr::map_dfr() 的本机管道
【发布时间】:2021-10-26 01:48:00
【问题描述】:

我想将新的原生管道|>purrr::map_dfr() 一起使用。 (为了使其可重现,我将数据集作为字符串而不是路径传递,但这不应该有所作为。)

csvs <- c(
  "csv_a" = "a,b,c\n1,2,3\n4,5,6",
  "csv_b" = "a,b,c\n-1,-2,-3"
)
col_types <- readr::cols(.default = readr::col_character())

# Approach 1
csvs |> 
  purrr::map_dfr(
    .f = function(p) {
      readr::read_csv(
        file = I(p),
        col_types = col_types
      )
    }
  )

# Approach 2
library(magrittr)
csvs %>%
  purrr::map_dfr(
    .x = .,
    .f = ~readr::read_csv(
      file      = I(.),
      col_types = col_types
    )
  )

我有两个问题,主要是问continue my understanding of the native pipe

问题 1

如何用新的{\(x)...}() 语法替换显式的function(p) 部分?下面的尝试抛出“standardise_path(file) 中的错误:缺少参数“p”,没有默认值”。

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

问题 2

我也可以模仿 magrittr 方法(#2)吗?这会以某种方式读取每一行两次,包括标题。

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

# Produces
# A tibble: 8 x 3
  a     b     c    
  <chr> <chr> <chr>
1 1     2     3    
2 4     5     6    
3 a     b     c    
4 -1    -2    -3   
5 1     2     3    
6 4     5     6    
7 a     b     c    
8 -1    -2    -3   

编辑:作为对@MrFlick 评论的回应,我将file 的参数与I() 包装在一起,以防将来版本的readr 需要它(它似乎工作正常现在没有它)。如果您要传递典型的文件路径(而不是文字字符串),请删除对 I() 的调用。

【问题讨论】:

  • csvs |&gt; purrr::map_dfr( readr::read_csv ) 不够用吗?
  • 哎呀,我把它弄得太小了。我将使用read_csv() 的第二个参数对其进行修改。
  • 你已经在使用tidyverse函数了,为什么还需要原生的pipeOP?
  • 我可能不明白你关于为什么的问题。您是在问为什么要使用本机管道 (|&gt;),因为 tidyverse 包已经加载了 magrittr 包(%&gt;%)?如果是这样——因为我想学习如何去做,而且我猜当我使用非 tidyverse 包时也会出现这种需求。
  • 您使用的是哪个版本的readr?最新版本允许您传入多个文件名并将它们组合在一起。如果你现在想传递文字数据,你需要使用I()。请参阅 2.0 注释下的 Reading multiple files at once

标签: r pipe purrr


【解决方案1】:

问题 1 的答案 -

csvs |> 
  purrr::map_dfr(
    .f = \(k) {
      readr::read_csv(
        file      = k,
        col_types = col_types
      )
    }
  )

#     a     b     c
   <chr> <chr> <chr>
#1     1     2     3
#2     4     5     6
#3    -1    -2    -3

【讨论】:

  • 谢谢,效果很好。 (我包括了col_types 的效果,只是为了保持一致。)所以function(k)\(k) 替换。你能解释一下(a)为什么\(k)在大括号之外和(b)为什么大括号后面没有和空括号()吗?我很高兴它可以工作,但它与我迄今为止所了解的原生管道不同。
  • 我们通过管道应用的函数是map_dfr,它已经有()。这里我们将map_dfrfunction(k))的匿名函数替换为不需要()\(k)
猜你喜欢
  • 2018-09-14
  • 2019-07-27
  • 2020-06-09
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多