我以为我理解了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 和类似名称,但我不知道它应该如何工作。任何帮助表示赞赏。
从
?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)))