2016-09-29 8 views
0

Ich versuche, einen Zeichenvektor zu durchlaufen, und für jeden Wert eine etwas andere Abfrage auszuführen. Ich möchte dann die Ergebnisse erfassen und lokal als rdata-Datei speichern. Sobald das gespeichert ist, kann ich das R-Objekt löschen.Benannte Objekte dynamisch in einer Schleife benennen

Ich weiß, dass ich dies als eine Anwendung tun sollte/sapply und würde einen Tipp, wie schätzen, das zu tun ...

aber mein Hauptproblem ist, dass, während die rdata Dateien speichern schön mit den Namen Ich hatte gehofft (zB "TABLE1", "TABLE2"), wenn ich sie wieder in R lade, haben sie alle den Objektnamen "thisname", mit einem einzelnen Wert, der dem Namen entspricht, auf den ich gehofft hatte (z "TABELLE 1"). Ich habe versucht, diese Arbeit viel zu lange zu machen.

Wenn jemand einen Vorschlag hat, würde ich es begrüßen!

tables = c('TABLE1','TABLE2') 
for (i in 1:length(tables)){ 
     thisname=paste0(tables[i]) 
     data= sqlQuery(oracle.channel, paste("select * from",table_renamer(tables[i]),"WHERE ROWNUM<10;")) 
     assign(thisname,data) 
     save(thisname, file=file.path(paste0(tables[i],".RData"))) 
     rm(thisname) 
     rm(thisdf) 
     } 

Antwort

0

Verwenden Sie saveRDS(thing, file="file.rds").

Das spart nur den Wert des Objekts, so dass Sie es in durch Zuordnung zu einem beliebigen Namen lesen Sie mögen:

foo = readRDS("file.rds") 

Oder wenn Sie bereits gespeichert haben ein paar Dinge zu .rdata Dateien, so dass sie in eine Last neue Umgebung und erhalten Sie den Wert, etwas wie:

e = new.env() 
load("foo.RData", environment=e) 
foo = e$thisname 

Wickeln Sie das in eine Funktion für die Ordentlichkeit.

+0

Dank für das Schauen. Ich konnte saveRDS() nicht verwenden, weil mein Paket erfordert, dass Daten über data() geladen werden, was mich auf .RData- und rda-Dateien beschränkt. Am Ende fand ich eine Lösung auf Stapelüberlauf, und markierte meine Frage als ein Duplikat. Ich werde meine endgültige Lösung unten posten, falls jemand diesen Beitrag findet. – gruvn

0

Meine letzte Lösung nicht genutzt sapply, was schön ist:

#make a custom function to do the data handling, including saving 
saveit <- function(x, oracle.channel, data.dir){ 
     assign(x,sqlQuery(oracle.channel, paste("select * from",table_renamer(x),"WHERE ROWNUM<10;"))) 
     save(list=x, file=file.path(data.dir, paste0(x,".RData"))) 
} 
#sapply to make it happen 
sapply(tables, simplify=TRUE, saveit, oracle.channel, data.dir) 

Der eigentliche Trick spart die Liste: save(list=x, ...), die ich gelernt here

Verwandte Themen