2017-06-27 1 views
0

Je veux assigner des tracés en utilisant la fonction 'ggplot' à un objet que j'ai créé par la fonction 'eval'. Cet objet est niché dans une boucle et donc défini comme une liste. Lors de chaque tour de la boucle, le tracé doit être sauvegardé en tant qu'élément de la liste en utilisant la variable 'list_pos'.Erreur 'indice hors limites' en utilisant eval() - fonction basée sur la fonction assign() dans une boucle

L'objectif est de créer trois listes différentes 'Graphs_A', 'Graphs_B' et 'Graphs_C' avec trois tracés différents en tant qu'éléments sauvegardés. Par conséquent, par conséquent, je peux appeler les parcelles d'un sous-groupe spécifique, par exemple le groupe A, à la fois en lançant juste

Graphs_A 

Le R-Code ressemble à ce qui suit. Ici, dans mon exemple, j'attribue toujours la même intrigue aux éléments, ce qui, bien sûr, n'est pas le cas pour mon jeu de données réel.

###### Example ##### 

# Load packages 

install.packages('ggplot2') 
library(ggplot2) 

# Creating data 

names <- c("A","B","C") 

numbers <- c(1,2,3) 

df <- data.frame(
    x = c(1, 2, 3, 4, 5, 6, 7, 8), 
    y = c(3, 2, 4, 4, 6, 8, 9, 8) 
) 

# Loop to assign ggplot to elements of list 

for(j in names){ 
    assign(paste("Graphs_", j, sep=""), list()) 
    list_pos <- 0 

    for(i in numbers){ 
     list_pos <- list_pos + 1 
     assign(
     eval(parse(text=paste("Graphs_", j, sep="")))[[list_pos]], 
     ggplot() + geom_point(data=df, aes(x=x, y=y)) # Plot depends in real data set on value of i 
    ) 
    } 
} 

Je reçois toujours une erreur 'indice hors limites'. J'ai essayé différentes choses comme redéfinir la liste comme

assign(paste("Graphs_", j, sep=""), list("X","Y","Z")) 

Mais il n'a pas aidé à attribuer les parcelles aux éléments de la liste. Comment puis-je gérer ce problème?

+2

Oublie que 'parse' et' assign' existent. Vous n'en aurez pas d'utilisation valide tant que vous n'aurez pas beaucoup plus d'expérience dans R et qu'ils vous permettront seulement d'écrire du code mauvais (inefficace, difficile à comprendre ou à maintenir). – Roland

+0

Merci pour votre réponse. Mais malheureusement je dois les utiliser pour assigner des valeurs à des objets que je n'ai pas créés auparavant. Par conséquent, comme je sais que c'est la seule façon de créer une boucle imbriquée comme mentionné dans mon message. –

+0

Vous n'êtes pas obligé et vous ne devriez pas. Utilisez une liste. – Roland

Répondre

0

D'abord, la ligne eval(parse(text=paste("Graphs_", j, sep="")))[[list_pos]] n'a pas de sens: parse(text=paste("Graphs_", j, sep="")) donne une chaîne et eval évalue l'expression. Ainsi, vous ne pouvez pas sous-ensemble ...

Vous pouvez travailler avec eval(parse(text=...)) mais je recommande d'utiliser des listes:

# Loop to assign ggplot to elements of list 
Graphs <- list() 
for(j in 1:length(names)){ 
    for(i in numbers){ 
     Graphs[[j]] <- ggplot() + geom_point(data=df, aes(x=x, y=y)) 
    } 
} 

Je ne sais pas pourquoi vous voulez attribuer les parcelles à une liste, mais le code ci-dessus exécute ...

+0

Merci pour votre réponse! J'ai déjà réfléchi à votre solution. Mais cela ne marche pas pour moi car je veux sauvegarder l'intrigue dans différents objets 'Graphs_' en fonction du tour de la boucle avant. Ainsi, par exemple pour le premier tour de 'for (j dans les noms), les tracés sont différents dans mon jeu de données réel en fonction du tour de la boucle' for (i in numbers) '. Par conséquent, je souhaite obtenir trois listes 'Graph_A', 'Graph_B' et 'Graph_C' contenant trois éléments avec trois différentes parcelles selon 'for (i in numbers)'. Je peux donc appeler les parcelles pour différents groupes en même temps. –