我写了一个创建条形图的函数。我想将此图保存为pdf,并在应用此功能时将其显示在我的屏幕(x11)上。代码看起来像这样。
create.barplots <- function(vec)
{
x11() # opens the window
### Here is a code that creates a barplot and works perfectly
### but irrelevant for my question
dev.copy(pdf("barplots.table.2.pdf")) # is supposed to copy the plot in pdf
# under the name "barplots.table.2.pdf"
dev.off() # is supposed to close the pdf device
}
这会产生以下错误:'device'应该是一个函数
当我将代码修改为:
create.barplots <- function(vec)
{
x11()
### Here is a code that creates a barplot and works perfectly
### but irrelevant for my question
dev.copy(pdf) # This is the only difference to the code above
dev.off()
}
R显示绘图并创建一个名为Rplots.pdf的文件。由于几个原因,这是一个问题。
我还试图以相反的方式打开设备。首先打开pdf设备,而不是将pdf设备的内容复制到x11设备,而不是将pdf设备设置为活动设备,而不是关闭pdf设备。这里的代码如下所示:
create.barplots <- function(vec)
{
pdf("barplots.table.2.pdf") # open the pdf device
### Here is a code that creates a barplot and works perfectly
### but irrelevant for my question
dev.copy(x11) # copy the content of the pdf device into the x11 device
dev.set(which = 2) # set the pdf device as actice
dev.off() # close the pdf device
}
这里的问题是应该显示情节的wondow是空的!
总结一下,我有两个问题: 1)如何将绘图保存为pdf并同时在x11中显示?和 2)如何将绘图保存在其他地方的工作目录中?
修改的
上述解决方案效果很好。但我仍然不明白为什么
pdf("barplots.table.2")
barplot(something)
dev.copy(x11)
显示一个空的灰色窗口,而不是在窗口设备中复制pdf设备的内容!我也试过
pdf("barplots.table.2")
barplot(something)
dev.copy(window)
我也失败了......
答案 0 :(得分:25)
怎么样:
create.barplots <- function(...) {
x11()
plot.barplots(...) # create the barplot
dev.copy2pdf(file = "path/to/barplots.table.2.pdf")
}
答案 1 :(得分:9)
您可以在pdf
来电中轻松添加dev.copy
的参数,如下所示:
create.barplots <- function(vec,dir,file)
{
windows()
plot(vec)
dev.copy(pdf,file=paste(dir,file,sep="/")
dev.off()
}
dev.copy()
有一个...参数将参数传递给pdf函数,另请参阅?dev.copy
。或者,你可以使用dev.copy2pdf
,正如马克斯告诉你的那样。我还建议您使用windows()
代替x11()
,否则您可能会遇到字体系列问题。 x11和pdf的默认值并不总是匹配。
要将文件保存在另一个目录中,只需添加完整目录(例如使用粘贴,就像上面的函数一样)
答案 2 :(得分:4)
正如我在previous post中提到的,您可以考虑我的knitr
包裹;如果您在交互式R会话中使用它,您将能够在窗口中看到这些图并将其保存为pdf而不会出现任何黑客攻击(这是默认行为)。我仍然需要在documentation和演示上付出很多努力,但它应该能够使用Rnw文档。你可以看到这些图并将其保存在knitr
中的主要原因是knitr
与设计中的Sweave非常不同 - 图形设备在代码之后打开进行评估,因此您的绘图不会隐藏在屏幕外设备中。同样,我需要警告你,目前它是高度实验性的。
答案 3 :(得分:0)
从内部函数调用时,以下对我很有效。在绘图代码后调用它:
pdf2 <- function (file = "plot.pdf", w = 10, h = 7.07, openPDF = FALSE)
{
dev.copy2pdf(file = file, width = w, height = h, out.type = "pdf")
if(openPDF) browseURL(file)
}
NB。 openPDF
只能在Windows中使用完整(非相对)文件路径。
答案 4 :(得分:0)
根据Max Gasner的回答,我编写了这个辅助功能,可以快速切换显示而不是显示。参数x是绘图对象或执行绘图的函数。
savepdf<-function(x, file, display=TRUE) {
if (display){
x;
dev.copy2pdf(file=file)
}
else {
pdf(file=file)
x;
dev.off()
}
}
示例:
savepdf(plot(c(1,2,3)), file="123.pdf", display=F)