如何在R的map()中按推荐方式传递参数调用函数?
解决map()函数用法错误的问题
你的错误原因很明确:map()的第一个参数必须是要迭代的向量,而你后来的代码里只传入了匿名函数,漏掉了这个核心参数,导致R把匿名函数当成了要迭代的对象,所以报错说.x是函数而非向量。
正确写法示例
写法1:沿用外部向量file_names
保持第一个参数为file_names,匿名函数用x指代每个文件名元素:
library(tidyverse) file_names <- c("filename1", "filename2", "filename3") data <- data_frame(filename = file_names) %>% mutate(content = map(file_names, \(x) read_tsv(x, skip = 1, col_names = FALSE)))
写法2:推荐使用数据框内的filename列(更符合tidyverse风格)
在mutate()中直接引用当前数据框的filename列作为迭代对象,这样如果后续对数据框做过滤、排序等操作,能保证迭代的是当前行对应的文件名:
data <- data_frame(filename = file_names) %>% mutate(content = map(filename, \(x) read_tsv(x, skip = 1, col_names = FALSE)))
写法3:用波浪号~简化匿名函数
tidyverse支持用~代替\(x),用.x指代迭代元素,代码更简洁:
data <- data_frame(filename = file_names) %>% mutate(content = map(filename, ~read_tsv(.x, skip = 1, col_names = FALSE)))
补充说明
map()的标准语法是map(.x, .f, ...):
.x:要迭代的向量/列表.f:应用在每个元素上的函数(可以是匿名函数,也可以是已命名函数)...:传递给.f的额外参数
你最初的正确代码map(file_names, read_tsv)其实是省略了匿名函数的简写形式,当read_tsv的第一个参数正好是.x的元素时,可以直接传入函数名;但需要添加额外参数时,必须显式写出匿名函数来指定参数对应关系。
内容的提问来源于stack exchange,提问作者GreenManXY
相关产品推荐
相关产品推荐

