3 回答
TA贡献1804条经验 获得超7个赞
除了其他出色的答案之外,这里还有一个使用看起来“正常”的评估而不是的解决方案eval。由于for循环没有单独的变量范围(即,它们在当前环境中执行),因此我们需要使用它local来包装for块;此外,我们需要创建i一个局部变量-我们可以通过将其重新分配为其自己的名称1来做到这一点:
myplots <- vector('list', ncol(data2))
for (i in seq_along(data2)) {
message(i)
myplots[[i]] <- local({
i <- i
p1 <- ggplot(data2, aes(x = data2[[i]])) +
geom_histogram(fill = "lightgreen") +
xlab(colnames(data2)[i])
print(p1)
})
}
但是,完全干净的方法是for完全放弃循环,并使用列表函数生成结果。这可以通过几种可能的方式工作。我认为以下是最简单的方法:
plot_data_column = function (data, column) {
ggplot(data, aes_string(x = column)) +
geom_histogram(fill = "lightgreen") +
xlab(column)
}
myplots <- lapply(colnames(data2), plot_data_column, data = data2)
这有几个优点:更简单,并且不会使环境混乱(使用loop变量i)。
1这看起来似乎令人困惑:为什么根本i <- i没有效果?—因为执行分配,所以我们创建了一个新的局部变量,其名称与外部作用域中的变量相同。我们同样可以使用其他名称,例如local_i <- i。
TA贡献1852条经验 获得超1个赞
由于所有传递的表达式都被引用,因此i在循环结束时求值的那是i当时发生的一切,这是它的最终值。您可以通过eval(substitute(在每次迭代中输入正确的值来解决此问题。
myplots <- list() # new empty list
for (i in 1:4) {
p1 <- eval(substitute(
ggplot(data=data.frame(data2),aes(x=data2[ ,i]))+
geom_histogram(fill="lightgreen") +
xlab(colnames(data2)[ i])
,list(i = i)))
print(i)
print(p1)
myplots[[i]] <- p1 # add each plot into plot list
}
multiplot(plotlist = myplots, cols = 4)
TA贡献1780条经验 获得超5个赞
拥有很多非常大的地块是一个问题,而这两种解决方案都不是。一种常见的解决方案是对您绘制的数据点数进行二次采样(通常,这样的大图无论如何都无法可靠地显示所有单独的数据点),或者在绘制之前计算汇总统计信息(并绘制这些而不是原始数据)。但有时两者都不起作用。在这种情况下,唯一的解决方案是避免一次在内存中包含多个图。
- 3 回答
- 0 关注
- 2552 浏览
添加回答
举报