for循环难以理解的行为[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有一个非常奇怪的问题......我正在尝试在循环中创建绘图并将它们放到列表中,之后将它们全部绘制在一个页面上。当我这样做时:

for (i in 1:ncol(df)){ 
   plot[[i]] <- ggplot(df, aes(x = df[,i], y=(..count..)/sum(..count..))) + 
     geom_bar(fill="#003366") + 
     labs(title = dfcolnames[i], x = "Variable Values", y = "Frequency") 
}
return(multiplot(plotlist=plot, cols = 2))

我得到3个相同的图,但是当我没有for循环时这样做:

plot[[1]] <- ggplot(df, aes(x = df[,1], y=(..count..)/sum(..count..))) + geom_bar(fill="#003366") + labs(title = dfcolnames[1], x = "Variable Values", y = "Frequency")
plot[[2]] <- ggplot(df, aes(x = df[,2], y=(..count..)/sum(..count..))) + geom_bar(fill="#003366") + labs(title = dfcolnames[2], x = "Variable Values", y = "Frequency") 
plot[[3]] <- ggplot(df, aes(x = df[,3], y=(..count..)/sum(..count..))) + geom_bar(fill="#003366") + labs(title = dfcolnames[3], x = "Variable Values", y = "Frequency") 
return(multiplot(plotlist=plot, cols = 2))

我得到了正确的情节(三种不同)。我不明白发生了什么......有什么想法吗?

r loops for-loop ggplot2
1个回答
4
投票

问题是aes()执行惰性评估。传递给aes()的值仅在您实际绘制绘图时才会得到解决。你真的应该只是将符号名称传递给aes()。这是因为在循环结束后,i将被固定在它的循环的最后一个值,你将获得相同的情节三次。

您可以使用aes_string并循环遍历列名称

plot <- lapply(names(df), function(colname) {
  ggplot(df, aes_string(x = colname, y="(..count..)/sum(..count..)")) + 
           geom_bar(fill="#003366") + 
           labs(title = colname, x = "Variable Values", y = "Frequency") 
})

经过测试

set.seed(10)
df <- data.frame(a=rpois(100, 5), b=rpois(100, 7), c=rpois(100, 3))
© www.soinside.com 2019 - 2024. All rights reserved.