R: write_xlsx с проблемой оценки в аргументе - PullRequest
0 голосов
/ 01 марта 2019

У меня есть такой цикл:

library(writexl)
file_output="C:/test/test.xlsx"
for(i in 1:2){
    df<-iris[i,]
    write_xlsx(list(i=df),file_output)
    }

Я бы хотел сохранить каждую итерацию на отдельном листе с именем значение из i (или вмоя настоящая программа: значение некоторой переменной).Возможно ли это с помощью write_xlsx или вообще можно ли выполнить write_xlsx (или какую-либо другую функцию) для интерпретации:

"list (i = df)" как «list (1 = df)"и" список (2 = df) "

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вместо i = df вы должны назвать элементы списка.Для вашего цикла это будет означать:

file_output = "C:/test/test.xlsx"
for(i in 1:2){
  df <- iris[i,]
  out <- list(df)
  names(out) <- i
  write_xlsx(out, file_output)
}

Однако это приведет к одному файлу на data.frame, поскольку write_xlsx не добавляется к существующим файлам (по крайней мере, насколько мне известно).Если вы хотите иметь только один файл с листами для различных data.frames, вам придется адаптировать свой код:

file_output = "C:/test/test.xlsx"
vars <- 1:2
out <- vector(mode = "list", length = length(vars))
for(i in vars){ # if you use variable names in vars, use seq_along(vars) instead of vars
  out[[i]] <- iris[i,]
}
names(out) <- vars
write_xlsx(out, file_output)

Так как я не вижу никаких преимуществ в использовании цикла здесь, я 'даже предложил бы использовать map из пакета purrr или lapply:

file_output = "C:/test/test.xlsx"
vars <- 1:2
out <- map(vars, ~ iris[.x,])
names(out) <- vars
write_xlsx(out, file_output)
0 голосов
/ 01 марта 2019

Для этого вам, вероятно, не нужен цикл for.

Просто используйте names() на list объекте as.character(), чтобы назвать листы.

l <- lapply(1:2, function(i) iris[i, ]) #creates separated df for each row
names(l) <- as.character(1:2) # sets the names of each element in the list
# these will be the sheets name


file="path_to_file.xlsx" # path to file name
library(writexl)

write_xlsx(l, file)
...