2010-10-28 13 views
5

Supongamos que tengo una función que lee datos de una tabla MySQL, los manipula y devuelve algunos data.frame. Tenga en cuenta que la función es sólo un ejemplo cuya funcionalidad no tiene importancia en sí ..., ej .:¿Cómo devolver un data.frame con un nombre dado de una función?

addRowSd <- function(table,con,pattern="^Variable") { 

dframe <- dbReadTable(con,table) 
cn <- colnames(dframe) 
qs <- subset(x, x %in% grep(pattern, x, value=TRUE)) 
dframe$qsd <- sd(t(dframe[,c(qs)])) 

return(dframe) 
} 

mydf$sd <- addRowSd(...) 

termino con una llamada hoja.de.datos mydf. Ahora me gustaría hacer esto con un vector de caracteres de nombres de tablas SQL Y nombrar los marcos de datos devueltos de manera correspondiente. Si solo uso

x=lapply(MySQLtablenames,addRowSd,con) 

Voy a obtener una lista llamada x. Por supuesto, podría desvincular y cambiar el nombre de todo como quisiera, pero mi pregunta es:

¿Cómo puedo hacer que lapply (u otra función comparable) devuelva múltiples dataframes individuales o al menos una lista que contenga algunos nombres derivados de mi vector de caracteres "MySQLtablenames"?

+0

posiblemente podría ayudar a hacer que la función addRowSd asignar un nombre a hoja.de.datos regresado ... ¿Cómo –

+1

sobre 'names (x) <- MySQLtablenames' o en una línea' x <-setNames (lapply (MySQ) Ltablenames, addRowSd, con), MySQLtablenames) 'o' x <-lapply (setNames (MySQLtablenames, MySQLtablenames), addRowSd, con) ' – Marek

Respuesta

9

acaba de encontrar una respuesta por mi cuenta:

assign("somename",dframe,envir = .GlobalEnv) 
+0

Podría tener problemas de alcance con esto. Por ejemplo, si quiere usar la función dentro de otra función, entonces su data.frame se crea en un entorno global. Podrías jugar con 'parent.frame' para mejorar tu método. – Marek

+2

En ambos ejemplos, está insertando un DF en una lista (o 'lapply' devuelve una lista). En esos casos, el nombre del objeto que es el DF es irrelevante, ¿no es así? ¿Qué importancia tienen los 'nombres' para los componentes de la lista? Si estuviera haciendo esto, almacenaría los DF en una lista, establecería los nombres en la lista después de los nombres de las tablas, según el comentario anterior de Marek, y luego trabajaría con la lista. Si desea hacer referencia a los DF individuales por nombre, use 'with (x, DF.name)' donde 'x' es una lista devuelta por' lapply' y 'DF.name' es el nombre del DF al que desea acceder o alguna función aplicada a ella. –

+0

@Marek, actualmente, lo único que se encuentra con problemas de alcance es mi cerebro. el material de parent.frame es nuevo para mí y aún no lo entiendo, pero sí para señalarlo. ¿Qué causará los problemas de alcance? ¿Cargando muchos datos de la base de datos al mismo entorno (global)? –

1

Si proporciona un vector sapply carácter, se nombrará a los elementos de la lista devuelta por el vector de caracteres suministrada (USE.NAMES por defecto es true). .. también me gustaría usar simplificar = FALSO ya que dependiendo de las data.frames regresaron puede obtener resultados impredecibles

Cuestiones relacionadas