我認爲有幾種選擇,我按照我的喜好顯示。
## setup
require(ggplot2)
set.seed(10) # make reproducible
dat <- data.frame(x=1:10,y=runif(10))
我最喜歡的選擇是爲您的代碼創建一個簡單的函數包裝。然後,無論何時您需要更改數據,只需將新數據傳遞給您的函數,它就會將其提供給ggplot
並創建新圖形。這是靈活的,相當強大的問題。它也是可擴展的,因爲如果後來你決定你也希望能夠改變標題,那麼你也可以爲你的函數添加一個標題參數。
## my favorite option
myplot <- function(data) {
ggplot(data, aes(x, y)) + geom_point()
}
## use it
myplot(data = dat)
## change it
dat <- data.frame(x = 11:20, y = runif(10))
myplot(data = dat)
另一種方法是你要ggplot
調用保存爲一個表達式,這是未評估。然後你只需要評估它。這幾乎就像每次輸入代碼(它在某些方面有所不同,但這是我能想到的最好的比喻)。
## not wild about this one
myplotcall <- expression(ggplot(dat, aes(x,y)) + geom_point())
## look at it (literally just the input)
myplotcall
expression(ggplot(dat, aes(x, y)) + geom_point())
## use it
eval(myplotcall)
## change it
dat <- data.frame(x = 21:30, y = runif(10))
eval(myplotcall)
您可以更改ggplot
對象本身的數據。我認爲這種方法是最容易出問題的,因爲你正在使用一個對象內部的東西,而這個內部對象並沒有真正被用戶改變(也就是說,因爲我們不能說我們應該這樣做)。這是更爲恰當的%+%
操作完成(見joran的答案)
## not wild about this either
g <- ggplot(dat, aes(x,y)) + geom_point()
g ## use it
## change it
dat <- data.frame(x = 31:40, y = runif(10))
g$data <- dat
g
難道你不只是保存,然後加載工作區? – 2012-07-11 11:44:40
實際上,無論dat是否設置爲NULL,「第二個g」都會生成一個圖。並且g包含數據:嘗試輸入g $數據。 – neilfws 2012-07-11 12:10:18
我們需要版本號碼,人員! packageDescription(「ggplot2」)$ Version = 0.9.1,g有一個$ data元素中數據的副本。我不敢相信這會改變。要保留對數據的引用,以便在數據發生變化時繪圖發生變化將是一件非常奇怪的事情... – Spacedman 2012-07-11 14:52:32