R 需要重新启动 RStudio 以使用 dev.copy() 和 dev.off() 查看并保存在文件中
R Need to restart RStudio to view and save in a file using dev.copy() and dev.off()
我正在尝试创建绘图并最终将其保存为文件。但是因为我正在做很多更改并且想测试一下,所以我希望能够同时查看和保存情节。我查看了 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 Photo Viewer can't open this picture because the picture is being edited in another program")。每次都要重启,很不方便
我做错了什么,我如何在每次不重新启动 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 绘图窗格中的 'export' 按钮并手动保存。
否则,您选择尝试复制它对我来说也是显而易见的。
据我所知,R 中的设备抽象不允许将设备封装为对象,因此例如可以将其作为执行实际绘图的函数的参数。由于 dev.set()
将索引作为参数,将索引作为参数传递将取决于设备堆栈的状态。
我自己还没有想出一个干净的解决方案,有时反驳说通过调用某个设备来包围绘图渲染代码并在之后立即保存它,并根据全局切换设备。
因此,如果可以的话,请使用 RStudios 导出功能,否则抽象将需要维护全局设备堆栈的状态并对其状态进行广泛测试,因为它是全局的并且您无法将 plot 调用指向某个设备,它只是绘制到当前设备(据我所知)。
OP评论后编辑
如果您在 dev.off
之后无法观看文件,您遇到的情况似乎有些不同,但还需要退出 RStudio。对于某些类型的绘图框架,需要在图形对象上调用 print 以将其实际打印到文件中。也许这是由 RStudio 在关闭时作为打开设备的正常拆卸程序的一部分完成的?在这种情况下,如果您在退出 RStudio 之前强行查看其内容,则该文件应该为空。
有时有用的另一件事是调用 dev.off
两次。我不知道为什么,但有时创建的设备比我预期的要多。完成 dev.off
后,dev.list
显示什么?
OP编辑后编辑
我看得出来,png(); dev.copy(); dev.off()
。这将使您打开的设备多于关闭的设备。您仍然会打开第一个打开的图形设备,正如您在执行清单时所看到的那样。您可以简单地删除 dev.copy()
。图像将保存在 dev.off()
并且应该能够从文件系统打开。
至于为什么看不到RStudio图形设备,我不太确定。可能是其他代码扰乱了您的设备堆栈。我会检查一个干净的会话是否存在,以确保其他代码不会篡改设备堆栈。从 RStudio 论坛和其他 SO 问题来看,RStudio 中似乎存在与绘图窗格相关的问题,这些问题在将 RStudio 更新到最新版本后已得到解决。如果这对您来说是一个可行的解决方案,我会尝试的。
我刚刚在 R.devices 包的开发者版本中添加了对 RStudio 的 RStudioGD 设备的支持(我是作者)。这将允许您在 RStudio 中执行以下操作:
library("R.devices")
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)
)
figs <- devEval(c("RStudioGD", "png"), name = "foo", {
plot(Y ~ X, data = sample.df)
})
您可以指定任何一组输出目标类型,例如c("RStudioGD", "png", "pdf", "x11")
。输出到文件的设备默认会将文件写入文件夹figures/
,文件名为<name>.<ext>
,例如figures/foo.png
在上面的例子中。
调用的值 figs
包含对生成的所有数字的引用,例如figs$png
。您可以使用运算符 !
直接从 R 中打开它们。例如:
> figs$png
[1] "figures/foo.png"
> !figs$png
[1] "figures/foo.png"
后一个调用应该使用您系统的 PNG 查看器显示 PNG 文件。
在我将这些更新提交给 CRAN 之前,您可以安装开发者版本 (2.15.1.9000) 为:
remotes::install_github("HenrikBengtsson/R.devices@develop")
我正在尝试创建绘图并最终将其保存为文件。但是因为我正在做很多更改并且想测试一下,所以我希望能够同时查看和保存情节。我查看了 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 Photo Viewer can't open this picture because the picture is being edited in another program")。每次都要重启,很不方便
我做错了什么,我如何在每次不重新启动 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 绘图窗格中的 'export' 按钮并手动保存。
否则,您选择尝试复制它对我来说也是显而易见的。
据我所知,R 中的设备抽象不允许将设备封装为对象,因此例如可以将其作为执行实际绘图的函数的参数。由于 dev.set()
将索引作为参数,将索引作为参数传递将取决于设备堆栈的状态。
我自己还没有想出一个干净的解决方案,有时反驳说通过调用某个设备来包围绘图渲染代码并在之后立即保存它,并根据全局切换设备。
因此,如果可以的话,请使用 RStudios 导出功能,否则抽象将需要维护全局设备堆栈的状态并对其状态进行广泛测试,因为它是全局的并且您无法将 plot 调用指向某个设备,它只是绘制到当前设备(据我所知)。
OP评论后编辑
如果您在 dev.off
之后无法观看文件,您遇到的情况似乎有些不同,但还需要退出 RStudio。对于某些类型的绘图框架,需要在图形对象上调用 print 以将其实际打印到文件中。也许这是由 RStudio 在关闭时作为打开设备的正常拆卸程序的一部分完成的?在这种情况下,如果您在退出 RStudio 之前强行查看其内容,则该文件应该为空。
有时有用的另一件事是调用 dev.off
两次。我不知道为什么,但有时创建的设备比我预期的要多。完成 dev.off
后,dev.list
显示什么?
OP编辑后编辑
我看得出来,png(); dev.copy(); dev.off()
。这将使您打开的设备多于关闭的设备。您仍然会打开第一个打开的图形设备,正如您在执行清单时所看到的那样。您可以简单地删除 dev.copy()
。图像将保存在 dev.off()
并且应该能够从文件系统打开。
至于为什么看不到RStudio图形设备,我不太确定。可能是其他代码扰乱了您的设备堆栈。我会检查一个干净的会话是否存在,以确保其他代码不会篡改设备堆栈。从 RStudio 论坛和其他 SO 问题来看,RStudio 中似乎存在与绘图窗格相关的问题,这些问题在将 RStudio 更新到最新版本后已得到解决。如果这对您来说是一个可行的解决方案,我会尝试的。
我刚刚在 R.devices 包的开发者版本中添加了对 RStudio 的 RStudioGD 设备的支持(我是作者)。这将允许您在 RStudio 中执行以下操作:
library("R.devices")
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)
)
figs <- devEval(c("RStudioGD", "png"), name = "foo", {
plot(Y ~ X, data = sample.df)
})
您可以指定任何一组输出目标类型,例如c("RStudioGD", "png", "pdf", "x11")
。输出到文件的设备默认会将文件写入文件夹figures/
,文件名为<name>.<ext>
,例如figures/foo.png
在上面的例子中。
调用的值 figs
包含对生成的所有数字的引用,例如figs$png
。您可以使用运算符 !
直接从 R 中打开它们。例如:
> figs$png
[1] "figures/foo.png"
> !figs$png
[1] "figures/foo.png"
后一个调用应该使用您系统的 PNG 查看器显示 PNG 文件。
在我将这些更新提交给 CRAN 之前,您可以安装开发者版本 (2.15.1.9000) 为:
remotes::install_github("HenrikBengtsson/R.devices@develop")