我一直在摆弄R中的一个函数,长话短说,我有一个for
循环,并且在每一步,我使用png
保存一个图,然后立即readPNG
以便我可以提取RGB信息。然后我制作第二个图,然后readPNG
这样我就可以比较两个图像的RGB。
问题是我经常收到一条关于无法启动png()
设备或打开文件进行写入的错误消息,经过多次循环后(可能只有少数几个循环,或者很多循环)几千)。
这是真正简化的代码,但它有最基本的功能,并生成错误消息:
testfun<-function(beg,fini)
{
library(png)
setwd("D://mydirectory")
for (i in beg:fini)
{
png("test.png",width=277,height=277) #candidate image
par(mai=c(0,0,0,0))
plot(1,type="n",ann=FALSE,xlim=c(0,255),ylim=c(0,255),
xaxt="n",yaxt="n",frame.plot=F)
polygon(x=c(10,60,60),y=c(10,10,60),col="red")
graphics.off()
image<-readPNG("test.png")
#code where I get rgb values for original
png("test2.png",width=277,height=277) #candidate image with diferent params
par(mai=c(0,0,0,0))
plot(1,type="n",ann=FALSE,xlim=c(0,255),ylim=c(0,255),
xaxt="n",yaxt="n",frame.plot=F)
polygon(x=c(10,60,60),y=c(10,10,60),col="blue")
graphics.off()
image<-readPNG("test2.png")
#code where I get rgb values for second image, and compare
}
}
错误信息:
Error in png("test.png", width = 277, height = 277) :
unable to start png() device
In addition: Warning messages:
1: In png("test.png", width = 277, height = 277) :
Unable to open file 'test.png' for writing
2: In png("test.png", width = 277, height = 277) : opening device failed
最初我有graphics.off()
作为dev.off()
,但后来认为可能循环太快以至于在需要再次打开之前关闭一台设备的速度不够快而且它在某种程度上变得“混乱” 。我也尝试在每个Sys.sleep(0.1)
之后使用graphics.off
,但这也没有帮助。我错过了一些愚蠢而明显的东西,或者这只是一个设备错误?
答案 0 :(得分:20)
我遇到了同样的问题,虽然不是在循环情况下。就我而言,这是因为我将.png输出指向一个不存在的目录。
png('./tweets/graphics/unique words.png', width=12, height=8, units='in', res=300)
创建目录并正确引用后,错误就消失了,我得到了我的.png图像。
答案 1 :(得分:8)
我在循环中保存绘图时遇到了这个问题。 @Dino Fire给了我一个提示,我的循环生成的文件名包含一个非法字符...
确保文件名合法(查找斜杠,&符号,撇号等)。
答案 2 :(得分:0)
对我来说,readPNG()
不起作用的原因是因为我从Rmd
(RMarkdown)文件中运行它。
在R控制台或常规脚本中运行代码后,它立即起作用。
答案 3 :(得分:0)
如果您使用的是RStudio(或R),请将工作目录设置为图片所在的位置(。jpg,.png)。它应该是目录,而不仅仅是(C:/)。
getwd()
setwd("C:/RCode/Deep Learning/Downloads/")
getwd()