2010-02-23 5 views
4

J'essaye de changer le nom d'une variable qui est incluse dans un appel de boucle for et de fonction. Dans l'exemple ci-dessous, je voudrais que column_1 soit passé à la fonction plot, puis column_2 etc. J'ai essayé d'utiliser do.call, mais il retourne "object 'column_j' not found". Mais l'objet column_j est là, et la fonction plot fonctionne si je les code en dur. Aide grandement appréciée.Comment puis-je inclure un nom de variable dans un appel de fonction dans R?

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

Répondre

6

-je:

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))) 
} 

Et je n'ai pas d'erreurs. Peut-être que vous pourriez fournir un code dur qui (selon votre question) fonctionne, alors il sera plus simple de trouver une raison de l'erreur.

(je sais que je peux générer des vecteurs en utilisant la boucle et assign, mais je veux donner bon exemple)

+1

aussi je ne pouvais pas reproduire le problème de l'affiche originale. –

2

Vous pouvez le faire sans la commande paste() dans votre boucle for. Il suffit d'attribuer les colonnes via la fonction colnames() dans votre boucle:

column_to_plot <- colnames(dataframeNAME)[j] 

Espoir qui aide comme une première bidouille.

1

Voici une façon de le faire:

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))) } 

Vous pouvez également faire colnames (tmp.df) [j] au lieu de la pâte (..) si vous le souhaitez.

2

Êtes-vous tente de récupérer un objet dans l'espace de travail par une chaîne de caractères? Dans ce cas, analyser() peut aider:

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

Dans ce cas, vous pouvez utiliser do.call(), mais il ne serait pas nécessaire.

Edit: WRAPP parse() eval()

+0

Stephen, merci, j'étais curieux de la fonction d'analyse, donc j'ai essayé votre exemple, mais cela n'a pas fonctionné pour moi. J'ai aussi essayé avec parse (text = column_to_plot) [[1]]) pour obtenir juste l'élément que je voulais tracer, mais il dit que les longueurs 'x' et 'y' diffèrent. Cependant, plot (x, column_2) fonctionne dans ce cas. – John

+0

Ah, désolé! Voir edit ci-dessus ... (retournez l'appel à parse() dans eval()) – hatmatrix

Questions connexes