我有一个函数,既可以返回一些统计数据,又可以使用基于R的图形绘制图形。我想要禁止该函数的绘图,而是将绘图作为对象返回,以便可以从函数外部控制是否绘图。
我试过了:
使用gridGraphics包,我可以按照this question中的建议将基本图形图转换为对象
plot(1:10)
grid.echo()
a = grid.grab()
grid.draw(a)剩下的问题是plot()命令绘制了我想要隐藏的绘图。因此,我试图像answer here建议的那样,通过绘制到临时文件中的设备来抑制它。代码变成:
ff = tempfile()
svg(filename = ff)
plot(1:10)
grid.echo()
a = grid.grab()
dev.off()
unlink(ff)但现在,grid.echo()找不到任何要回显的图形,并抛出警告:
Warning message:
In grid.echo.recordedplot(recordPlot(), newpage, prefix, device) :
No graphics to replay我已经将这个问题追溯到grid.echo()不能回显来自Rstudio默认设备以外的其他设备的图形,无论是否在临时文件中。这本身就很奇怪,因为grid.echo()文档说它会从当前设备回显图形,但没有提到任何限制。
有没有人可以帮助我解决隐藏基本图形绘图并将其作为对象返回的问题,或者建议如何修复我失败的尝试,或者使用另一种方法?
发布于 2019-03-25 21:24:39
LocoGris解决了this中有关grid.echo行为的问题。
下面的代码将不需要的图形输出绘制到临时文件中,在取消链接临时文件之前,使用grid.echo和grid.grab将绘图保存为网格对象,以便只保留绘图对象,从而产生被忽略的行为:
ff = tempfile()
svg(filename = ff)
plotfun <- function() plot(1:10)
grid.echo(plotfun)
a = grid.grab()
dev.off()
unlink(ff)与正在讨论的代码的不同之处在于,以R为基础的图形中的绘图被放入一个函数并传递给grid.echo,而不是依靠grid.echo从当前设备自动找到它需要的内容。
可能有用的注意事项:grid.echo将绘制两次,如果使用不带临时文件的常规svg(),则可以看到这一点,因为两个文件将显示相同的绘图。我假设第一个图是基于R的图形,第二个是使用网格系统的回声。
https://stackoverflow.com/questions/55283707
复制相似问题