簡體   English   中英

R需要重新啟動RStudio才能使用dev.copy()和dev.off()查看並保存在文件中

[英]R Need to restart RStudio to view and save in a file using dev.copy() and dev.off()

我試圖創建一個繪圖,並最終將其另存為文件。 但是因為我要進行很多更改並想要對其進行測試,所以我希望能夠同時查看和保存繪圖。 我查看了該頁面以完成我想做的事情,但是在我的系統中,它似乎沒有按預期的方式工作。

這是我的代碼:

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無法打開該圖片,因為該圖片正在其他程序中進行編輯”)。 我每次都需要重新啟動,因此非常不方便。

我在做什么錯?如何在不每次重新啟動RStudio的情況下查看和查看保存的文件? 先感謝您!

加成

根據LoveTä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繪圖窗格中的“導出”按鈕,然后手動保存圖像。

否則,您嘗試復制它的選擇對我來說也是顯而易見的。

據我所知,R中的設備抽象不允許將設備封裝為一個對象,因此例如可以將其作為執行實際繪圖的函數的參數。 由於dev.set()以索引作為參數,因此將索引作為參數傳遞將取決於設備堆棧的狀態。

我本人並沒有提出一個干凈的解決方案,有時我反駁到將繪圖渲染代碼括在括號內,並調用某個設備,然后保存該代碼,然后根據全局切換設備。

因此,如果可以的話,請使用RStudios導出功能,否則抽象將需要維護設備全局堆棧的狀態並對其狀態進行廣泛的測試,因為它是全局的,並且您無法將繪圖調用定向到特定設備,因此簡單地繪制到當前設備(據我所知)。


OP評論后編輯

如果您無法在dev.off之后觀看文件,但是您似乎需要退出RStudio,似乎正在發生一些不同的行為。 對於某些類型的繪圖框架,需要在圖形對象上調用print以使其實際打印到文件中。 也許這是RStudio在關機時作為打開設備的正常拆卸程序的一部分來完成的嗎? 在這種情況下,如果您在退出RStudio之前強行查看其內容,則該文件應為空。 有時可行的另一件事是兩次調用dev.off 我不知道為什么,但是有時創建的設備比我預期的要多。 完成dev.offdev.list顯示什么?


OP編輯后編輯

我可以看到, png(); dev.copy(); dev.off() png(); dev.copy(); dev.off() 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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM