如何使用 R 中的 map() 内部的函数,使用推荐的传递参数方式?

问题描述 投票:0回答:1

我以为我理解了map()是如何工作的,但显然我不明白。我有一个与工作目录中的真实文件相对应的文件名向量:

file_names <- c("filename1", "filename2", "filename3")

这有效:

library(tidyverse)

data <- data_frame(filename = file_names) %>%
  mutate(content = map(file_names, read_tsv))

但是当我想使用推荐的格式向 read_tsv 添加参数时

map(\\(x) f(x, arg1, arg2))

data <- data_frame(filename = file_names) %>%
 mutate(content = map(\(file_names) read_tsv(file_names, skip = 1, col_names = FALSE)))

我收到错误:

mutate()
中的错误: ℹ 在争论中:
content = map(function(file_names) read_tsv(file_names, skip = 1, col_names = FALSE))
。 由
map()
中的错误引起: !
.x
必须是向量,而不是函数。

我尝试将 file_names 更改为 .x 和类似名称,但我不知道它应该如何工作。任何帮助表示赞赏。

r dataframe purrr
1个回答
2
投票

?map
你可以看到:

地图(.x,.f,...,.progress = FALSE)

因此,您的

.x
函数中仍然需要
map
(列表或原子向量),这将是您的
file_names
向量。您应该在第二个参数 (
.f
) 中提供函数,它允许使用多种格式来指定函数:

命名函数

我认为这不是推荐的方式

我们现在通常建议不要使用 ... 将附加(常量)参数传递给 .f

data_frame(filename = file_names) %>%
  mutate(content = map(file_names, read_tsv, skip = 1, col_names = FALSE))

匿名函数

您可以在

map
中定义匿名函数,格式为
function(argument) foo(argument)
或简写
\(argument) foo(argument)
,其中
foo
是您在
map
中应用的实际函数。

data_frame(filename = file_names) %>%
  mutate(content = map(file_names, \(file_names) read_tsv(file_names, skip = 1, col_names = FALSE)))

一个公式

这更像是指定函数的“tidyverse”方式,您必须使用

.x
来引用第一个参数。

data_frame(filename = file_names) %>%
  mutate(content = map(file_names, ~read_tsv(.x, skip = 1, col_names = FALSE)))
© www.soinside.com 2019 - 2024. All rights reserved.