2017-03-26 4 views
0

Ich habe Probleme beim Aufrufen eines Objekts aus einer Liste von einer erstellten Variablen innerhalb meiner for-Schleife.Objekte aus der Liste aufrufen

for (i in 1:10) 
{ 
#create variables and run through function 
varName<-paste("var",i,sep="") 
assign(varName, rnmf(data, k=i, showprogress=FALSE)) 

#create new variable using object 3 from varName output 
varNF<-paste("varNF",i,sep="") 
assign(varNF, (data-varName[[3]])^2) 
} 

Mein Problem ist mit dem zweiten Teil meiner for-Schleife. Ich versuche, das dritte Objekt aus der Ausgabe meiner ersten erstellten Variable in der Berechnung meiner zweiten Variablen zu verwenden. Wenn ich varName[[3]] verwende, bekomme ich "subscript out of bounds", und wenn ich varName$fit verwende, bekomme ich "$ operator is invalid for atomic vectors".

Es sieht aus wie varName in meinem zweiten Teil ruft nicht die inkrementierende varName (var1, var2, var3, etc ...), die ich erstelle, aber es ruft die tatsächliche Variable varName. Um zu versuchen, um das zu bekommen, habe ich versuchte stattdessen

assign(varNF, (data-get(paste("var",i,"[[3]]",sep="")))^2) 

Was mir den Fehler gab "object 'var1[[3]]' not found". Aber wenn ich einfach var1 [[3]] in meiner R-Konsole anrufe, existiert es. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll. Jede Hilfe wäre großartig!

+1

Ich glaube, Sie suchen 'get', aber die Nutzung von 'assign' in einer' for' Schleife lässt mich zusammenzucken. Es gibt bessere Möglichkeiten, wenn Sie etwas Kontext geben. – alistaire

+0

Grundsätzlich habe ich etwa 200 Variablen, die ich über meine Funktion erstellen und senden muss. Innerhalb jeder dieser neu erzeugten Variablen befindet sich eine Liste von Objekten, in denen ich eine (die dritte) verwenden muss, um eine neue Variable zu erstellen. Das einzige Problem, das ich habe, ist das Objekt aus der Liste der Objekte in der ersten neuen Variablen – coderX

+1

aufrufen 'varName' speichert eine einzelne Zeichenfolge hier, das ist der Name der Variablen, also, wenn Sie es aufrufen, erhalten Sie diese Zeichenfolge ('" var1 "'), nicht die Variable 'var1'. Um das zu tun, müsstest du '(varName) [[3]]' 'bekommen. Dies ist jedoch immer noch ein schlechter Ansatz. Es ist besser, Ihre Daten in einem einzigen Datenrahmen oder einer einzigen Liste zu strukturieren, sodass sie in sich iterierbar ist. Darüber hinaus wird Gruppierung und Neuformierung viele Iterationen ohnehin irrelevant machen. – alistaire

Antwort

1

Eine sehr nützliche Daumenregel in R:

Wenn Sie sich finden entweder assign() oder get() in Ihrem Code verwenden, ist es ein starker Indikator dafür, dass Sie das Problem mit den falschen Werkzeugen nähern. Wenn Sie immer noch denken, dass Sie diese Funktionen verwenden sollten, denken Sie noch einmal darüber nach. Die Werkzeuge, die Sie vermissen, sind höchstwahrscheinlich R-Listen und Teilmengen von Listen.

(und alle sagen, dass Sie über die oben wissen)

In Ihrem Fall würde ich so etwas tun:

library("rNMF") 
[...] 

var <- list() 
varNF <- list() 
for (i in 1:10) { 
    res <- rnmf(data, k = i, showprogress = FALSE) 
    var[[i]] <- res 
    varNF[[i]] <- (data - res$fit)^2 
} 
Verwandte Themen