如何用purrr::map将R列表元素导出为对应命名的xlsx文件
如何用purrr::map将列表元素按名称导出为Excel文件
我来帮你解决这个问题!你已经有了命名好的列表l2,想要把每个tibble元素导出成以对应列表名称命名的Excel文件,之前的两种写法问题出在没有正确对应每个元素和它的文件名,下面我来拆解错误原因并给出正确方案:
先说说你之前代码的问题
- 第一种写法
map(l2, write_xlsx, str_c(names(l2), ".xlsx")):这里map会把l2的每个元素传给write_xlsx的第一个参数,但第二个参数path你传了整个文件名向量,这会导致每个tibble都被重复导出到所有文件名里,完全不符合预期。 - 第二种写法
map(l2, ~write_xlsx(l2, path = str_c(names(l2), ".xlsx"))):匿名函数里你传入了整个l2而不是当前迭代的元素(应该用.x指代当前元素),同时path还是整个向量,结果就是重复把整个列表导出到两个文件里,肯定不对。
正确的解决方案
方法1:用purrr::imap(推荐,更简洁)
imap是专门为命名列表设计的map变体,它会自动把列表元素的名称作为第二个参数传递给函数,完美匹配你的需求:
library(tidyverse) library(writexl) # 你的原始数据 l2 <- list( tibble(x = 1:5, y = 1, z = x ^ 2 + y), tibble(x = 2:6, y = 3, z = x ^ 2 + y) ) names(l2) <- c("name_1", "name_2") # 核心代码 imap(l2, ~write_xlsx(.x, path = str_c(.y, ".xlsx")))
这里的匿名函数中,.x代表当前遍历到的列表元素(也就是单个tibble),.y就是该元素对应的名称,这样每个tibble都会被精准导出到以自身名称命名的Excel文件中。
方法2:用purrr::map2
如果你更习惯用map2,可以把列表和它的名称作为两个平行的序列来遍历:
map2(l2, names(l2), ~write_xlsx(.x, path = str_c(.y, ".xlsx")))
map2会同步遍历l2的元素和names(l2)的元素,效果和imap完全一致,只是写法上需要明确传入名称列表。
运行完上述代码后,你的工作目录下就会生成name_1.xlsx和name_2.xlsx两个文件,分别对应列表里的两个tibble。
内容的提问来源于stack exchange,提问作者Leonardo Ribeiro
相关产品推荐
相关产品推荐

