5 Stimmen

Wie kann ich einen Variablennamen in einen Funktionsaufruf in R einfügen?

Ich versuche, den Namen einer Variablen zu ändern, die in einer for-Schleife und einem Funktionsaufruf enthalten ist. In dem folgenden Beispiel möchte ich, dass Spalte_1 an die Plot-Funktion übergeben wird, dann Spalte_2 usw. Ich habe versucht, do.call zu verwenden, aber es gibt "object 'column_j' not found" zurück. Das Objekt column_j ist jedoch vorhanden, und die Plot-Funktion funktioniert, wenn ich sie fest eincodiere. Hilfe ist sehr willkommen.

for (j in 2:12) {
    column_to_plot = paste("column_", j, sep = "")
    do.call("plot", list(x, as.name(column_to_plot)))
}

6voto

Marek Punkte 47395

Das tue ich:

x <- runif(100)
column_2 <-
    column_3 <-
    column_4 <-
    column_5 <-
    column_6 <-
    column_7 <-
    column_8 <-
    column_9 <-
    column_10 <-
    column_11 <-
    column_12 <- rnorm(100)

for (j in 2:12) {
    column_to_plot = paste("column_", j, sep = "")
    do.call("plot", list(x, as.name(column_to_plot)))
}

Und ich habe keine Fehler. Vielleicht könnten Sie Hard-Code, die (nach Ihrer Frage) funktioniert, dann wird einfacher sein, einen Grund für den Fehler zu finden.

(Ich weiß, dass ich Vektoren mit Schleife und assign aber ich möchte ein klares Beispiel geben)

2voto

mropa Punkte 10904

Sie können es auch ohne die paste() Befehl in Ihrem for Schleife. Weisen Sie die Spalten einfach über die Funktion colnames() in Ihrer Schleife:

column_to_plot <- colnames(dataframeNAME)[j]

Ich hoffe, das hilft für den ersten Versuch.

2voto

hatmatrix Punkte 39643

Versuchen Sie, ein Objekt im Arbeitsbereich über eine Zeichenkette abzurufen? In diesem Fall könnte parse() helfen:

for (j in 2:12) {
    column_to_plot = paste("column_", j, sep = "")
    plot(x, eval(parse(text=column_to_plot)))
}

In diesem Fall könnten Sie do.call() verwenden, aber das wäre nicht erforderlich.

Bearbeiten: parse() in eval() verpacken

1voto

Leo Alekseyev Punkte 12075

Hier ist eine Möglichkeit, dies zu tun:

tmp.df <- data.frame(col_1=rnorm(10),col_2=rnorm(10),col_3=rnorm(10))
x <- seq(2,20,by=2)
plot(x, tmp.df$col_1)
for(j in 2:3){
  name.list <- list("x",paste("col_",j,sep=""))
  with(tmp.df, do.call("lines",lapply(name.list,as.name))) }

Sie können auch colnames(tmp.df)[j] anstelle von paste(..) verwenden, wenn Sie möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X