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