readxl Перебирает несколько листов в рабочей книге при передаче дополнительных аргументов

#r #readxl

#r #readxl

Вопрос:

Readxl предоставляет хорошее решение для перебора нескольких листов и присвоения имен этим листам, что отлично работает.

https://readxl.tidyverse.org/articles/articles/readxl-workflows.html

 path <- readxl_example("datasets.xlsx")
path %>% 
 excel_sheets() %>% 
 set_names() %>% 
 map(read_excel, path = path) 
 

Однако мне нужно передать дополнительные аргументы в read_excel ..например, как показано ниже, желаемый результат.

 read_excel("datasets.xlsx",col_names = FALSE, skip = 1)
 

Решения, которые я пробовал

 path <- readxl_example("datasets.xlsx")
path %>% 
 excel_sheets() %>% 
 set_names() %>% 
 map(read_excel(col_names = FALSE, skip = 1), path = path) 
 

и

 read_excel_func <- function(y){
 readxl::read_excel(y, col_names = FALSE, skip = 1)
}

path <- readxl_example("datasets.xlsx")
path %>% 
 excel_sheets() %>% 
 set_names() %>% 
 map(read_excel_func, path = path)
 

Комментарии:

1. На самом деле это не readxl проблема, а проблема в том, как передавать аргументы в map функциях. Вы можете использовать нотацию формулы вокруг функции. В последнем блоке вы переходите path = path к функции, которая не принимает аргумент с именем path

Ответ №1:

Мы можем сделать это с помощью анонимного вызова функции с ~

 library(readxl)
library(dplyr)
path %>% 
 excel_sheets() %>% 
   set_names() %>% 
   map(~ read_excel(.x, col_names = FALSE, skip = 1, path = path))
 

Или просто передайте аргументы map как path

 path %>% 
  excel_sheets() %>% 
  set_names() %>% 
  map(read_excel, col_names = FALSE, skip = 1, path = path)
 

Комментарии:

1. идеальное решение!