我在R中有一个从网站读取数据并绘制2列的函数。我怎样才能使它第一次运行该函数时初始化一个新图形,但随后的运行(将标有'reset'参数)将向图形添加一组新的点而不是覆盖旧的?
getdata<- function(team,year,reset=F){
#Retrieve/format Data
[..]
#Plot Data
if (reset==T)
{
p <-ggplot(data, aes(x = no, y = pts)) +
geom_path(colour="red", size=2) +
geom_point(colour="black" ,size = 2, shape=21, fill="white")
return(p)
}
else
{
add<-ggplot(data, aes(x = no, y = pts)) +
geom_path(colour = "blue", size = 2) +
geom_point(colour="black", size = 2, shape=21, fill="white")
p <- p + add
return(p)
}
我认为我的问题类似于此处发布的内容:Adding line with points to a plot in ggplot2但我在将其添加为当前现有情节的列表时遇到了一些问题。
我是R的初学者所以可能会做一些愚蠢的事情!
感谢您的帮助,一直在与此搏斗。
答案 0 :(得分:2)
有一些事情需要发生才能发挥作用:
geom_point()
),而不是整个ggplot
对象所以这是一个潜在的实现(注意,未经测试,因为您的示例不可重现):
make_getdata <- function() { # THIS FUNCTION RETURNS A FUNCTION
p <- NULL # WE WILL STORE PLOT HERE
function(team,year,reset=F) {
# get data
if(reset || is.null(p)) {
p <<- ggplot(data, aes(x = no, y = pts)) + # NOTICE DOUBLE ARROW
geom_path(colour="red", size=2) +
geom_point(colour="black" ,size = 2, shape=21, fill="white")
} else {
p <<- p + # NOTICE DOUBLE ARROW
geom_path(data=data, aes(x = no, y = pts), colour = "blue", size = 2) +
geom_point(data=data, aes(x = no, y = pts), colour="black", size = 2, shape=21, fill="white")
}
return(p)
} }
getdata <- make_getdata() # this creates your `getdata` function and stores it in `getdata`
getdata(...)
这里的关键是我们利用R的作用域属性创建一个持久变量,我们存储图形。 make_getdata()
创建一个函数以及一个函数环境。该环境包含p
,我们可以使用<<-
来存储我们的地块。