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?
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
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. –
Vous n'êtes pas obligé et vous ne devriez pas. Utilisez une liste. – Roland