R:将Graph作为参数传递给函数

时间:2015-09-04 06:20:30

标签: r rstudio

我有一个体面的图表,我使用

绘制
r <- ggplot(data=data2.Gurgaon,aes(x=createdDate,y=count))+geom_point()

现在我想高亮点图上的几点说500,1000,5000等。 所以,我正在尝试编写一个函数,在其中我可以传递我想要标记的点 以下是我写的函数

graphPoint <- function(graph,point) {
  g <- graph
  g <- g+geom_point(aes(x=createdDate[point],y=count[point]),pch=1,size=8,col='black')
  g <- g+ geom_point(aes(x=createdDate[point],y=count[point]),pch=16,size=5,col='red')
  g
}

当我传递参数时

r -> graphPoint(r,500)

这是错误

Error in lapply(X = x, FUN = "[", ..., drop = drop) : 
  object 'point' not found
我对R不是那么好。希望它可能,但我在某个小点失踪了..谢谢。

2 个答案:

答案 0 :(得分:2)

这实际上是ggplot中一个非常微妙(并且令人烦恼......)的问题,尽管不是一个错误。 aes(...)函数首先在默认数据集的上下文中评估所有符号(例如,它查找具有该名称的列),如果在全局环境中失败,则。它并没有向调用链上移,正如你可能有理由期望的那样。因此,在您的情况下,首先在point的上下文中评估符号data2.Gurgaon。由于没有这样的列,它在全局环境中查找point,但在graphPoint(...)函数的上下文中查找 not 。这是一个演示:

df <- mtcars
library(ggplot2)
graphPoint <- function(graph,point) {
  g <- graph
  g <- g + geom_point(aes(x=wt[point],y=mpg[point]),pch=1,size=8,col='black')
  g <- g + geom_point(aes(x=wt[point],y=mpg[point]),pch=16,size=5,col='red')
  g
}

ggp <- ggplot(df, aes(x=wt, y=mpg)) + geom_point()
point=10
graphPoint(ggp, 10)

这是有效的原因是因为我在全球环境中定义了point;函数内的point变量被忽略(你可以通过用10以外的东西调用fn来证明:你会得到相同的图)。

解决这个问题的正确方法是对data=...参数进行子集化,如另一个答案中所示。

答案 1 :(得分:1)

您无法在ggplot函数的美学部分中选择数据的子集,就像您尝试的那样。但是,您可以通过从ggplot对象中提取原始数据,对其进行子集化以及在函数的其余部分中使用子集来实现此目的。

r <- ggplot(data=mtcars,aes(x=cyl,y=drat))+geom_point()

 graphPoint <- function(graph,point) {
  g <- graph
  data_subset <- g$data[point, ]
  g <- g+geom_point(data = data_subset, 
                    aes(x=cyl,y=drat),pch=1,size=8,col='black')
  g <- g+ geom_point(data = data_subset,
                     aes(x=cyl,y=drat),pch=16,size=5,col='red')
  g
 }

 graphPoint(r, point = 2)

PS即将发布的帖子我建议您使用通常可访问的数据(如mtcars数据)制作可重现的示例。这样可以更轻松地帮助您。