2016-08-22 1 views
1

Ich verwende den folgenden Code in einer Schleife, ich repliziere nur den Teil, in dem ich das Problem habe. Der gesamte Code ist extrem lang und ich habe Teile entfernt, die dazwischen gut laufen diese Zeilen. Dies ist nur das Problem zu erklären:Alternative Funktion in r zuweisen

for (j in 1:2) 
    { 
     assign(paste("numeric_data",j,sep="_"),unique_id) 
     for (i in 1:2) 
     { 
     assign(paste("numeric_data",j,sep="_"), 
       merge(eval(as.symbol(paste("numeric_data",j,sep="_"))), 
       eval(as.symbol(paste("sd_1",i,sep="_"))),all.x = TRUE)) 
     } 
     } 

Das Problem, das ich bin vor, dass anstelle von assign im zweiten Schritt, ich verwenden möchte (eval + Paste)

for (j in 1:2) 
    { 
     assign(paste("numeric_data",j,sep="_"),unique_id) 
     for (i in 1:2) 
     { 
     eval(as.symbol((paste("numeric_data",j,sep="_"))))<- 
       merge(eval(as.symbol(paste("numeric_data",j,sep="_"))), 
       eval(as.symbol(paste("sd_1",i,sep="_"))),all.x = TRUE) 
     } 
     } 

jedoch R tut nicht akzeptieren eval beim Zuweisen neuer Variablen. Ich schaute auf das Forum und überall wird vorgeschlagen, das Problem zu lösen. Wenn ich jedoch assign verwende, überschreibt die Schleife meine zuvor erzeugten "numeric_data", anstatt sie zu addieren, daher erhalte ich für nur einen Wert von i statt für beide Werte.

+1

Ich bin mir nicht sicher, ob ich die Verwendung von 'eval'" normal "betrachten würde. – nrussell

+0

Sicher, lassen Sie mich diese Bemerkung entfernen – Shaz

+0

Sie müssen es nicht entfernen; was ich meinte war, warum willst du speziell 'eval' benutzen? – nrussell

Antwort

2

Hier ist ein sehr einfaches Intro zu einer der grundlegendsten Datenstrukturen in R. Ich empfehle dringend, mehr über sie in Standarddokumentationsquellen zu lesen.

#A list is a (possible named) set of objects 
numeric_data <- list(A1 = 1, A2 = 2) 
#I can refer to elements by name or by position, e.g. numeric_data[[1]] 
> numeric_data[["A1"]] 
[1] 1 

#I can add elements to a list with a particular name 
> numeric_data <- list() 
> numeric_data[["A1"]] <- 1 
> numeric_data[["A2"]] <- 2 
> numeric_data 
$A1 
[1] 1 

$A2 
[1] 2 

#I can refer to named elements by building the name with paste() 
> numeric_data[[paste0("A",1)]] 
[1] 1 

#I can change all the names at once... 
> numeric_data <- setNames(numeric_data,paste0("B",1:2)) 
> numeric_data 
$B1 
[1] 1 

$B2 
[1] 2 

#...in multiple ways 
> names(numeric_data) <- paste0("C",1:2) 
> numeric_data 
$C1 
[1] 1 

$C2 
[1] 2 

Grundsätzlich ist die Lehre, dass, wenn Sie Objekte mit Namen, die mit numerischen Suffixe haben: object_1, object_2 usw. sollten sie fast immer mit Namen Elemente in einer einzigen Liste, die Sie leicht konstruieren können und verweisen zu.

+0

Ich stelle fest, dass du springst: D +1 obwohl dies wahrscheinlich die Frage des OP nicht beantwortet. Aber ich denke, es zeigt in die richtige Richtung. – RHertel

+1

@RHertel Einen Weg zu finden, Menschen zu helfen, die sich selbst in diese bestimmte Ecke verschlüsselt haben, war für mich ein ständiges Rätsel. Ich habe versucht, viele verschiedene Arten zu beantworten, aber wahrscheinlich wäre der einzige wirkliche Weg zu helfen, mit ihnen an der Tastatur zu sitzen und den gesamten Code zusammen zu betrachten. – joran

+0

Es hat meine Frage nicht beantwortet, aber es gibt mir eine andere Idee, das Problem anzugehen – Shaz