2010-10-28 4 views
5

Suppongo di avere una funzione che legge i dati da una tabella MySQL, li manipola e restituisce alcuni dati.frame. Nota la funzione è solo un esempio la cui funzionalità non importa se stessa ..., per es .:Come restituire un data.frame con un nome dato da una funzione?

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(...) 

io alla fine con un data.frame chiamato mydf. Ora mi piacerebbe fare questo a un vettore di caratteri di nomi di tabelle SQL e nominare i datafile restituiti in modo corrispondente. Se uso solo

x=lapply(MySQLtablenames,addRowSd,con) 

Otterro 'una lista chiamata x. Naturalmente potrei non elencare e rinominare tutto nel modo in cui mi piacerebbe, ma la mia domanda è:

Come posso rendere lapply (o un'altra funzione paragonabile) restituire più singoli dataframes o almeno una lista che contiene alcuni nomi derivati dal mio personaggio vettore "MySQLtablenames"?

+0

forse potrebbe aiutare a rendere la funzione addRowSd assegnare un nome al data.frame tornato ... come –

+1

su 'nomi (x) <- MySQLtablenames' o in una riga' x <-setNames (lapply (MySQ Ltablenames, addRowSd, con), MySQLtablenames) 'o' x <-lapply (setNames (MySQLtablenames, MySQLtablenames), addRowSd, con) ' – Marek

risposta

9

appena trovato una risposta da solo:

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

Si potrebbe incorrere in problemi di scoping con questo. E.g se vuoi usare la funzione all'interno di un'altra funzione, allora il tuo data.frame viene creato nell'ambiente globale. Puoi giocare con 'parent.frame' per migliorare il tuo metodo. – Marek

+2

In entrambi i tuoi esempi, stai inserendo un DF in un elenco (o 'lapply' restituisce una lista). In questi casi, il nome dell'oggetto che è il DF è irrilevante, non è così. Che importa sono i 'nomi' per i componenti della lista. Se lo facessi, memorizzerei i DF in una lista, imposterei i nomi sulla lista dopo i nomi delle tabelle, come da commento di Marek sopra, e poi lavorerò con la lista. Se vuoi fare riferimento ai singoli DF per nome, usa 'con (x, DF.name)' dove 'x' è la lista restituita da' lapply' e 'DF.name' è il nome del DF a cui vuoi accedere o qualche funzione applicata ad esso. –

+0

@Marek, attualmente l'unica cosa che incontra problemi di scoping è il mio cervello. la roba di parent.frame è completamente nuova per me e non la capisco ancora, ma per dirlo. Cosa causerà problemi di scoping? Caricamento di molti dati dal database allo stesso ambiente (globale)? –

1

Se si fornisce sapply un vettore carattere, nominerà gli elementi della lista restituita da parte del vettore di carattere in dotazione (USE.NAMES predefinito TRUE). .. vorrei anche usare semplificare = FALSE a seconda delle data.frames restituito è possibile ottenere risultati imprevedibili