2010-05-04 32 views
2

我一直在使用ggplot2已经有一段时间了,我找不到从ggplot对象获取公式的方法。尽管我可以通过summary(<ggplot_object>)获得基本信息,但为了获得完整的公式,通常我通过.Rhistory文件进行梳理和梳理。当你尝试使用新的图表,特别是当代码有点冗长的时候,这会变得令人沮丧......所以通过历史文件搜索并不是很方便的做法......有没有更高效的方法来做到这一点?只是一个例证:来自ggplot对象的回拨

p <- qplot(data = mtcars, x = factor(cyl), geom = "bar", fill = factor(cyl)) + 
    scale_fill_manual(name = "Cylinders", value = c("firebrick3", "gold2", "chartreuse3")) + 
    stat_bin(aes(label = ..count..), vjust = -0.2, geom = "text", position = "identity") + 
    xlab("# of cylinders") + ylab("Frequency") + 
    opts(title = "Barplot: # of cylinders") 

我可以得到一些基本信息与summary

> summary(p) 
data: mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb [32x11] 
mapping: fill = factor(cyl), x = factor(cyl) 
scales: fill 
faceting: facet_grid(. ~ ., FALSE) 
----------------------------------- 
geom_bar: 
stat_bin: 
position_stack: (width = NULL, height = NULL) 

mapping: label = ..count.. 
geom_text: vjust = -0.2 
stat_bin: width = 0.9, drop = TRUE, right = TRUE 
position_identity: (width = NULL, height = NULL) 

但我想我的代码输入,即可让图。我认为我在这里错过了一些必不可少的东西......看起来不可能,没有办法从ggplot对象中接到电话!

+0

我用'str()'和'dput'查看'p',并且找不到调用。可能不可能。 – 2010-05-04 20:54:57

+0

如何使用脚本文件?如果您正在使用R-GUI,则可以轻松使用它。例如,文件 - >新建打开一个新的空白脚本文件。如果不保存它,您可以评估脚本文件(在mac中,命令-E或命令输入)。 – kohske 2010-05-05 00:19:45

+0

kohske,我使用的是GNU/Linux发行版,Emacs + ESS,恐怕没有任何GUI ......至少不是“常规GUI”......但是我不清楚的是: “你用'脚本文件是什么意思?''我提到了一种从'.Rhistory'文件中调用的方法,但那不是我正在寻找的内容......我会在'ggplot2'组中尝试我的运气...这绝对看起来像一个方便的功能... – aL3xa 2010-05-05 01:17:27

回答

3

它目前无法从GGPLOT2对象去那个(可能)创建它的代码。

+0

我等着听你的这个消息! =)你认为这是一个好主意吗?我当然希望看到这个功能在新版本中实现... – aL3xa 2010-05-06 21:07:16

+0

这是对我的待办事项清单,但不是很高,因为不幸的是它需要相当多的重写:/ – hadley 2010-05-08 03:47:13

3

您可以使用'expression()'将任何R代码存储为表达式,然后使用'eval()'对其进行评估。 例如

p <- expression(qplot(data = mtcars, x = factor(cyl), geom = "bar", fill = factor(cyl)) + 
    scale_fill_manual(name = "Cylinders", value = c("firebrick3", "gold2", "chartreuse3")) + 
    stat_bin(aes(label = ..count..), vjust = -0.2, geom = "text", position = "identity") + 
    xlab("# of cylinders") + ylab("Frequency") + 
    opts(title = "Barplot: # of cylinders")) 

然后

eval(p)

将产生情节但原代码仍然存储在变量“P”作为表达。

所以

p

产生

expression(qplot(data = mtcars, x = factor(cyl), geom = "bar", 
    fill = factor(cyl)) + scale_fill_manual(name = "Cylinders", 
    value = c("firebrick3", "gold2", "chartreuse3")) + stat_bin(aes(label = ..count..), 
    vjust = -0.2, geom = "text", position = "identity") + xlab("# of cylinders") + 
    ylab("Frequency") + opts(title = "Barplot: # of cylinders")) 

这就是我们开始。如果用parse()解析为文本,则'eval()'也可以将字符串评估为表达式,例如,

eval(parse(text='f(arg=value)')

+0

当然我可以,字符串(字符)也应该足够了。像这样:'s - “rnorm(10)”; eval(parse(text = s))'。但显然,没有办法直接这样做,因为'ggplot'对象在列表中没有'call'元素。 – aL3xa 2010-05-05 08:26:03

+0

当然。但是如果ggplot没有保存你输入它返回的对象,那么类似这样的东西将是你唯一的选择。 – wkmor1 2010-05-05 11:38:35

+0

@ aL3xa。按照您的建议添加了另一种使用eval()的方式。 – wkmor1 2010-05-05 11:44:29