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

Gre*_*nXY 1 r dataframe purrr

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

\n
file_names <- c("filename1", "filename2", "filename3")\n
Run Code Online (Sandbox Code Playgroud)\n

这有效:

\n
library(tidyverse)\n\ndata <- data_frame(filename = file_names) %>%\n  mutate(content = map(file_names, read_tsv))\n
Run Code Online (Sandbox Code Playgroud)\n

但是当我想使用推荐的格式向 read_tsv 添加参数时map(\\\\(x) f(x, arg1, arg2))

\n
data <- data_frame(filename = file_names) %>%\n mutate(content = map(\\(file_names) read_tsv(file_names, skip = 1, col_names = FALSE)))\n
Run Code Online (Sandbox Code Playgroud)\n

我收到错误:

\n
\n

错误mutate():\n\xe2\x84\xb9 参数:content = map(function(file_names) read_tsv(file_names, skip = 1, col_names = FALSE))。\n由以下错误引起map():\n!.x必须是向量,而不是函数。

\n
\n

我尝试将 file_names 更改为 .x 等,但我不知道它是如何工作的。任何帮助表示赞赏。

\n

ben*_*n23 8

?map你可以看出:

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

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


1. 命名函数

我认为这不是推荐的方式。

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

data_frame(filename = file_names) %>%
  mutate(content = map(file_names, read_tsv, skip = 1, col_names = FALSE))
Run Code Online (Sandbox Code Playgroud)

2. 匿名函数

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

data_frame(filename = file_names) %>%
  mutate(content = map(file_names, \(file_names) read_tsv(file_names, skip = 1, col_names = FALSE)))
Run Code Online (Sandbox Code Playgroud)

3. 一个公式

这更像是指定函数的“tidyverse”方式,您必须使用.x来引用第一个参数。

data_frame(filename = file_names) %>%
  mutate(content = map(file_names, ~read_tsv(.x, skip = 1, col_names = FALSE)))
Run Code Online (Sandbox Code Playgroud)