2012-09-05 23 views
5

De this post Recibí un script que exporta una lista como hojas de trabajo separadas en un archivo Excel (código como el siguiente). Ahora me gustaría envolverlo en una función conveniente para reproducir este comportamiento proporcionando el nombre de la lista de entrada y el nombre del archivo de salida.Función para guardar la lista R en hojas de cálculo de Excel separadas

datos de la muestra:

var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4) 

guión actual:

require("XLConnect") 
wb <- loadWorkbook("var1.xlsx", create = TRUE) 
createSheet(wb, names(var1)) 
writeWorksheet(wb, var1, names(var1),header=FALSE) 
saveWorkbook(wb) 

responsabilidad:Mientras me sonrojo a una pregunta tan simple, estoy seguro que muchos otros visitantes a SO les encantará encontrar esta información aquí; 7)

función

EDITAR :: listo para su uso:

save.excel <-function(.list, default = 'var1', path = ''){ 
    require("XLConnect") 
    .name <- as.list(match.call())[2] 
    if(is.language(.name[[1]])) wb_name <- paste0(paste0(path, default, collapse = '/'), '.xlsx') 
    if(is.symbol(.name[[1]])) wb_name <- paste0(paste0(path, as.character(.name), collapse = '/'), '.xlsx') 
    wb <- loadWorkbook(wb_name, create = TRUE) 
    createSheet(wb, names(.list)) 
    writeWorksheet(wb,.list, names(.list),header=FALSE) 
    saveWorkbook(wb) 
    } 

La única diferencia con respecto a la solución de abajo es que añadí XLConnect como una biblioteca solicitado desde el interior de la función, en caso de que no lo hiciera hacerlo manualmente antes; 7)

+0

No hay data.frames en su código de ejemplo, solo una lista con nombre – mnel

+0

¿Ha leído el archivo de ayuda para 'writeNamedRegion' – mnel

+0

@mnel, gracias. Segunda vez en 2 días consecutivos que hago ese error tipográfico. ** Blush ** – dmvianna

Respuesta

6

Esto no se ha probado, ya que XLConnect no se instalará en mi máquina. pero algo como lo siguiente podría funcionar

enfoque simple

Una función con dos argumentos

  • my_list - la lista que desea exportar elementos de hojas separadas
  • wb_name - El nombre de el libro de trabajo

La función es así

write_list <-function(my_list, wb_name = 'var1.xlsx') {  
    wb <- loadWorkbook(wb_name, create = TRUE) 
    createSheet(wb, names(my_list)) 
    writeWorksheet(wb, my_list, names(my_list),header=FALSE) 
    saveWorkbook(wb) 
} 

opción de lujo que va a utilizar el nombre de la lista

Si desea utilizar el nombre de la list para crear el archivo, entonces puede tener diversión con match.call, is.symbol y is.language. Los detalles de por qué haces esto están por debajo

write_list_name <-function(.list, default = 'var1', path = ''){ 
    .name <- as.list(match.call())[2] 
    if(is.language(.name[[1]])){ 
    wb_name <- sprintf("%s/%s.xlsx", path, default) 
    } 
    if(is.symbol(.name[[1]])) { 
    wb_name <- sprintf("%s/%s.xlsx", path, as.character(.name)) 
    } 
    wb <- loadWorkbook(wb_name, create = TRUE) 
    createSheet(wb, names(.list)) 
    writeWorksheet(wb,.list, names(.list),header=FALSE) 
    saveWorkbook(wb) 
    } 

el acuerdo is.language/is.symbol/match.call con las dos situaciones

write_list_name(var1) 

#in which case .name[[1]] is the symbol var1 

y

write_list_name(list(n=2:3)) 
# in which case .name[[1]] is list(n=2:3), and class language 
# a file called list(n=2:3).xlsx would be not ideal, hence the `default` argument. 
+1

Deducir el nombre de la hoja de cálculo del nombre del objeto (si es posible), imo distrae un poco del problema del OP. En un ejemplo más simple e ilustrativo de imo, el usuario puede especificar el nombre del archivo xlsx, es decir, usar 'wb_name' como argumento. –

+1

Además, puede reemplazar el doble código 'paste0' por una sola llamada a' sprintf': p. Ej. 'sprintf ("% s /% s.xlsx ", ruta, predeterminado)'. –

+0

Sí, tal vez está dorando el lirio o excediendo el pudín (encuentra la expresión apropiada). He editado la respuesta – mnel

2

Además de la solución de @mnel, aquí hay información general sobre las funciones.

En general, una función se ve algo como esto:

function_name = function(input_a, input_b) { 
    c = input_a * 2 
    d = do_something(input_b) 
    return(list(c, d)) 
} 

donde input_a y input_b son los argumentos de entrada y list(c, d) es el valor de retorno. Este valor de retorno se asigna al objeto que está en el lado izquierdo de la = cuando se llama a la función:

out_a = function_name(a, b) 

nota de que en el cuerpo de la función de function_name, a y b reemplazar input_a y input_b. El hecho de que a esté vinculado a input_a se realiza según el orden de los argumentos. argumentos Alternativamente, se puede utilizar con nombre:

out_a = function(input_a = a, input_b = b) 

Esto hace que la llamada a la función más fácil de leer en mi opinión, especialmente para los nombres de las funciones y argumentos bien elegidos.

Cuestiones relacionadas