3 回答

TA貢獻1804條經驗 獲得超7個贊
除了其他出色的答案之外,這里還有一個使用看起來“正?!钡脑u估而不是的解決方案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 關注
- 2783 瀏覽
添加回答
舉報