2014-01-21 15 views
6

Ich suche nach einer Möglichkeit, eine Variable unter einem anderen Namen "on the fly" in R save() (mit mir Bär! Ich bin mir ziemlich sicher, das ist kein Duplikat...). Hier ist ein Beispiel dafür, was ich mag würde erreichen:r - Umbenennen R Objekt während speichern() - ing

AAA = 1 
BBB = 2 
XXX = 3 
YYY = 4 
save(AAA=XXX, BBB=YYY, file="tmp.Rdat") 
# does NOT save a variable AAA to file with value 3 in it, which is the aim... 

Grundsätzlich möchte ich die save() Funktion den Wert von XXX nehmen und speichern Sie es unter einer Variablen in Datei AAA benannt. Beachten Sie, dass dies keine Frage zum Umbenennen einer Variablen ist: Ich könnte natürlich die Variable XXX vor dem Speichern umbenennen, z. AAA = XXX und dann save(AAA, ..., file=...), aber das würde natürlich mit dem Wert von AAA im Rest des Codes versauen.

Der offensichtliche Weg ist temporäre Variablen zu erstellen und dann die Werte wieder her:

AAA = 1 
BBB = 2 
XXX = 3 
YYY = 4 
AAAtmp = AAA; BBBtmp = BBB  # record values of AAA, BBB 
AAA = XXX; BBB = YYY 
save(AAA, BBB, file="tmp.Rdat") 
AAA = AAAtmp; BBB = BBBtmp  # restore values of AAA, BBB 

... aber jeder wird zustimmen, dass dies ziemlich chaotisch ist (vor allem mit viel mehr Variablen).

Das hat mich für eine Weile gestört, und mein Gefühl ist, dass die Funktion save() kann nicht tun, was ich will. Ich denke also, ich muss meinen Code aktualisieren und den Weg einer anderen Speicherfunktion (z.B. saveRDS()) gehen.

Danke für die Hilfe!

+0

Können Sie erklären, warum Sie dies tun möchten? Es scheint, als wäre saveRDS wahrscheinlich besser geeignet für das, was Sie wollen ... – Dason

+0

@Dason: kein Hauptgrund, nur so wie ich meine Sachen code: Manchmal muss ich eine Variable unter einem Namen speichern, der bereits im Arbeitsbereich existiert (Speichern Sie zB eine tmp-Variable und lassen Sie sie so aussehen, als wäre sie eine Nicht-TMP-Variable. Es ist ein paar Mal in der Vergangenheit und jedes Mal, wenn ich versuche herauszufinden, aber erfolglos. Also dieses Mal habe ich beschlossen, die Experten zu fragen ... :) –

Antwort

7

Dies erwies sich als ein wenig schwieriger, dass ich erwartet hatte. Ich werde interessiert sein zu sehen, was andere sich einfallen lassen und welche Einwände ich gegen meine Lösung haben könnte.

saveit <- function(..., file) { 
    x <- list(...) 
    save(list=names(x), file=file, envir=list2env(x)) 
} 

foo <- 1 
saveit(bar=foo, file="hi.Rdata") 
+1

Ja, das scheint perfekt zu funktionieren wie erwartet. Das Beste daran ist, dass am anderen Ende "load()" verwendet werden kann, was bedeutet, dass ich nicht alle Code-Teile aktualisieren muss, die die gespeicherten Daten tatsächlich nutzen (wie es bei mir der Fall wäre) 'saveRDS()'/'readRDS()' zum Beispiel). Ich muss aber noch eine neue Funktion 'saveit()' für diese Lösung definieren ... IMHO wäre es schön, das in die 'save() 'Funktion selbst eingebaut zu haben (laut Test in meinem ursprünglichen Post). –

0

fand ich, dass ich eine Liste erstellen und alle Objekte in der Umgebung zu jedem Element der Liste weisen Sie die „get“ -Funktion und dann kann ich jedes Element der Liste umbenennen.

andere Methoden sein könnten, die „zuweisen“ Funktion mit der „get“ Funktion

objectNames <- ls(all.names=T) 
res <- list() 
for (o in objectNames) { 
    res[[paste(prefix,o,sep="_")]] <- get(o) 
} 
format(object.size(res), units="Gb") 
0

Ein bisschen schneller zu bedienen als eine Funktion für den Job definieren, können Sie eine local Umgebung erstellen:

local({ 
    AAA <- XXX 
    BBB <- YYY 
    save(AAA, BBB, file="tmp.Rdat") 
}) 

Da Sie arbeiten und einer anderen Umgebung zuweisen, müssen Sie keine temporären Variablen speichern, die in der globalen Umgebung noch intakt sind:

> AAA 
[1] 1 
> BBB 
[1] 2