在r中循环tempfile()

时间:2015-12-11 11:30:17

标签: r ggplot2 base64 temporary-files

我不确定为什么这是错的。我基本上是尝试使用ggplot在HTML模板上创建进度条。为此,我需要创建一个for循环并将其存储在r中的temp文件夹中。然后将png文件编码为base64格式,以便将其放在HTML图像标记上。

library(catools)

a <- seq(1:10)
1:length(a)

for (i in 1:length(a)){

total_questions <- 8
current_question<- i+1

group <- rbind("Total Questions", "Current question")
progress <- rbind(total_questions, current_question)
colnames(progress)<- "Progress"
progress <- as.data.frame(progress)
progress_bar <- cbind(group,progress)


# save example plot to file

png(tec <- tempfile(paste0("image",i), fileext = ".png"))
ggplot(progress_bar, aes(group, Progress,fill=group), height=1000, width=800) + geom_histogram(stat="identity") 
dev.off()
# Base64-encode file
txt <- base64Encode(readBin(tec, "raw", file.info(tec)[1, "size"]), "txt")
txt
}

这是我的错误。

  

文件错误(con,&#34; rb&#34;):无法打开连接另外:   警告消息:在文件中(con,&#34; rb&#34;):无法打开文件   &#39; /var/folders/w0/lrdx2zvn2hgf_ds0f92hpy500000gn/T//RtmpWD4Ysl/image114459476144.png' ;:   没有这样的文件或目录

2 个答案:

答案 0 :(得分:1)

您可以使用ggsave代替。它可以保存任何ggplot2图,默认为最后一个。它会根据提供的文件路径的扩展名自动检测要写入的文件类型(此处为.png)。

此外,手动设置尺寸(宽度和高度)可以更加可靠地保存图形(否则,图形大小是您当前未设置的png设备的大小,默认为当前大小绘图屏幕IIRC)。

tec <- tempfile(paste0("image",i), fileext = ".png")
p <- ggplot( // your plot here // ) 
ggsave(tec, p, width=5, height=5)

请仔细选择尺码,因为它会对字体大小产生很大影响。如果您的使用需要5x5图像,则保存到10x10将导致文本在裁剪后减小两倍。如果您需要10x10图像,保存到5x5将会很难看。

如果您正在开发某种需要进度条图像的软件,您可能希望将图像保存为pdf,以使图像在任何尺寸下都能看起来很好。

答案 1 :(得分:1)

所以这对我有用。我能够创建并将每个绘图保存到临时文件中,然后继续获取base64代码,然后将其链接到html中的图像标记。因此,每当用户点击下一个问题时,新网页中的条形图将增加i。

require(grid) 
require(ggplot2)

a <- seq(1:10)
for(i in 1:length(a)){
total_questions <- 10
current_question<- i

group <- rbind("Total Questions", "Current question")
progress <- rbind(total_questions, current_question)
colnames(progress) <- "Progress"
progress <- as.data.frame(progress)
progress_bar <- cbind(group,progress)

# save example plot to file
png(tec <- tempfile(fileext = ".png"), height=200, width=300)
p <- ggplot(progress_bar, aes(group, Progress,fill=group)) +     geom_histogram(stat="identity") + coord_flip() + xlab("") + ylab("") + theme(legend.position="none") 
gt <- ggplot_gtable(ggplot_build(p))

# plot table without spacing. 
ge <- subset(gt$layout, name == "panel")
grid <- grid.draw(gt[ge$t:ge$b, ge$l:ge$r])
dev.off()

# Base64-encode file
library(RCurl)
txt <- base64Encode(readBin(tec, "raw", file.info(tec)[1, "size"]), "txt")
txt
}