R 需要重新启动 RStudio 以使用 dev.copy() 和 dev.off() 查看并保存在文件中

标签 r plot view save rstudio

我正在尝试创建一个绘图并最终将其保存为一个文件。但是因为我正在做很多更改并且想测试一下,所以我希望能够同时查看和保存情节。我看过this page做我想做的事,但在我的系统中,它似乎没有按预期工作。

这是我的代码:

png('Save.png')

sample.df <- data.frame(group =  c('A','B','A','C','B','A','A','C','B','C','C','C','B'),
X = c(2,11,3,4,1,6,3,7,5,9,10,2,8),
Y = c(3,8,5,2,7,9,3,6,6,1,3,4,10))

plot(Y ~ X, data = sample.df)

dev.copy(png, 'Save.png')
dev.off()

有几个问题(我是 R 的新手,所以我可能完全遗漏了一些东西):

(1) 当我使用 png() 时,我无法在 RStudio 中查看绘图,所以我使用了 dev.copy() 但它不允许我在 R studio 中查看我的绘图

(2) 即使在我使用 dev.off() 之后,我也无法查看保存的文件,直到我关闭 RStudio(说“Windows 照片查看器无法打开这张图片,因为图片正在另一个程序中编辑”) .每次都需要重启,很不方便。

我做错了什么?如何在每次不重新启动 RStudio 的情况下查看和查看保存的文件?提前致谢!

添加

根据 Love Tätting 的评论,当我运行 dev.list() 时,这就是我得到的结果。

> png('Save.png')
> 
> sample.df <- data.frame(group =  c('A','B','A','C','B','A','A','C','B','C','C','C','B'),
+                         X = c(2,11,3,4,1,6,3,7,5,9,10,2,8),
+                         Y = c(3,8,5,2,7,9,3,6,6,1,3,4,10))
> 
> plot(Y ~ X, data = sample.df)
> 
> dev.copy(png, 'Save.png')
png 
  3 
> dev.off()
png 
  2 
> dev.list()
png 
  2 
> dev.off()
null device 
          1 
> dev.list()
NULL

为什么我没有得到 RStudioGD?

最佳答案

RStudio 有自己的设备“RStudioGD”。您可以使用 dev.list() 查看它,默认情况下它是第一个也是唯一一个。

R 对渲染和后端解耦的设计是通过设备的抽象。您可以使用哪些取决于平台和环境。 dev.list() 显示当前设备的堆栈。

如果我对你的问题的理解正确,你想先在 RStudio 中显示图形,然后再决定是否要保存它。根据您保存图像的频率,您可以使用 RStudio 绘图 Pane 中的“导出”按钮并手动保存。

否则,您选择尝试复制它对我来说也是显而易见的。

据我所知,R 中的设备抽象不允许将设备封装为对象,因此例如可以将其作为执行实际绘图的函数的参数。由于 dev.set() 将索引作为参数,因此将索引作为参数传递将取决于设备堆栈的状态。

我自己还没有想出一个干净的解决方案,有时会反驳说通过调用某个设备来包围绘图渲染代码并在之后立即保存它,并根据全局切换设备。

因此,如果可以的话,请使用 RStudios 导出功能,否则抽象将需要维护全局设备堆栈的状态并对其状态进行广泛测试,因为它是全局的并且您无法将 plot 调用指向某个特定设备,它只是绘制到当前设备(据我所知)。


OP评论后编辑

如果您在 dev.off 后无法观看文件,但还需要退出 RStudio,这似乎是您遇到的一些不同行为。对于某些类型的绘图框架,需要在图形对象上调用 print 以将其实际打印到文件中。也许这是由 RStudio 在关闭时作为打开设备的正常拆卸程序的一部分完成的?在这种情况下,如果您在退出 RStudio 之前强行查看其内容,则该文件应该为空。 有时有用的另一件事是调用 dev.off 两次。我不知道为什么,但有时创建的设备比我预期的要多。完成dev.off后,dev.list显示什么?


OP编辑后编辑

我看得出来,png(); dev.copy(); dev.off()。这将使您打开的设备多于关闭的设备。您仍然会打开第一个打开的图形设备,正如您在执行 list 时所看到的那样。您可以简单地删除 dev.copy()。图像将保存在 dev.off() 上,并且应该能够从文件系统中打开。

至于为什么看不到 RStudio 图形设备,我不太确定。可能是其他代码扰乱了您的设备堆栈。我会检查一个干净的 session 是否存在,以确保其他代码不会篡改设备堆栈。从 RStudio 论坛和其他 SO 问题来看,RStudio 中似乎存在与绘图 Pane 相关的问题,这些问题在将 RStudio 更新到最新版本后已得到解决。如果这对您来说是一个可行的解决方案,我会尝试的。

关于R 需要重新启动 RStudio 以使用 dev.copy() 和 dev.off() 查看并保存在文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43812150/

相关文章:

R:如何使用 rCharts 绘制统计函数

以逗号分隔的字符串形式返回数字

r - 在线图周围插入边框

arrays - 将矩阵添加到 R 中的列表

r - hclust 图中的 ylim

android - 为什么在 View 和处理程序上发布和取消可运行会导致不同的行为?

html - 如何在rails4中的f.submit中给出图标类

java - 什么控制着 UI 屏幕上显示的 View 顺序?

同时运行多个 R 脚本

r - 将 dplyr tbl 列提取为向量