使用 purrr 传递多个函数(每个函数一次)

Pass multiple functions (each one time) ussing purrr

我有一个包含不同文件的文件夹,每个文件都有不同的格式,因此我创建了能够读取每个文件的不同函数。是否可以使用map将相应的功能应用于相应的文件?

我发现这个 可以将几个函数应用于对象,但我认为在这种情况下不适用,因为这里始终应用所有函数。

all_files <- list.dirs(file.path(path))
fun_A <- function(x) {read.csv(x)}
fun_B <- function(x) {read.table(x)}
fun_C <- function(x) {read.delim(x)}

funs <- c(fun_A , fun_B , fun_C)

因此,如果我手动执行它,它会起作用:

(all_files %>% 
    purrr::map(., ~list.files(., full.names = T)))[[1]][1] %>% fun_A() %>% 
  dplyr::bind_rows((all_files %>% 
                      purrr::map(., ~list.files(., full.names = T)))[[1]][2] %>% fun_B ()) %>% 
  dplyr::bind_rows((all_files %>% 
                      purrr::map(., ~list.files(., full.names = T)))[[1]][3] %>% fun_C())

但我用 purrr 尝试了几次,但我无法让它工作。这是我最后的尝试:

 all_files %>%  purrr::map(.x = ., ~{
    df = (.x)
    funs %>% purrr::map(., ~ df %>% (.))
    })

有什么建议吗?

您可以按照@akrun

的建议使用Mapmap2
do.call(rbind, Map(function(x, y) y(x), all_files, funs))

使用map2_df

purrr::map2_df(all_files, funs, ~.y(.x))

要实现这一点,预计 length(all_files)length(funs) 是相等的。