【问题标题】:Printing to a plot device created by a function打印到由函数创建的绘图设备
【发布时间】:2013-11-13 23:41:36
【问题描述】:

我想使用函数打开并命名pdf 绘图设备;在调用设备打开函数的级别上绘制它;然后使用在该级别给出的dev.off() 命令关闭它——这在R 中是否可行?

背景

我经常从 R 打印到 pdf,因此做了很多:

pdf(file.path(plotPATH, pdfName), width = Wwidth, height = Hheight)
plot( ...)
dev.off()

为了促进懒惰,我做了一个功能来打开情节设备并保存pdf(file.path(plotPATH ...))样板。

我创建的函数是:

pdfMk <- function(pdfName, Wwidth = 480, Hheight = 480) 
{ 
    pdf(file.path(plotPATH, pdfName), width = Wwidth, height = Hheight)
}

我想这样称呼:

pdfMk("foo.pdf")
plot(...)
dev.off()

问题在于这不起作用...输出是pdf,具有适当的名称和适当的位置,但它始终为空白。

我认为我可能对闭包(或其他东西)有问题,所以我尝试使用 debug 逐步执行 pdfMk 函数并在函数调用结束之前创建绘图,但输出仍然是空白 pdf(有在这两种情况下都没有错误消息)。

这可能吗?如果是这样,我该如何实现我的目标?

【问题讨论】:

    标签: r pdf plot


    【解决方案1】:

    您的代码按预期工作,但默认值除外。

    来自?pdf

    width, height:图形区域的宽度和高度,以英寸为单位。默认值为 7。

    您正在创建一个大小为 40 x 40 英尺的文档。

    【讨论】:

    • 非常感谢 - 我错过了这个细节有点尴尬。
    【解决方案2】:

    只是出于好奇:为什么不在函数中包含绘图和dev.off()? 类似的东西

    plotpath=file.path("C:","temp")
    
    pdf_wrapper=function(plot_expression,pdfName,plotpath,Wwidth=7,Hheight=7) {
        pdf(file.path(plotpath,pdfName),width=Wwidth,height=Hheight)
        plot_expression
        dev.off()
        Sys.sleep(0.5)
    }
    
    pdf_wrapper(plot(c(1,2),c(1,2),type='l',col='blue',lty=2),"test.pdf",plotpath)
    

    顺便说一句:在这种情况下,我总是在末尾加上Sys.sleep(...)。如果有后续调用 pdf_wrapper,这很有用。我不知道这是由于 R 还是 RStudio,但有时当我不包括等待时间时,我会收到损坏的 pdf 文件。似乎可以确保有足够的时间正确打开设备。但是,我使用的是ggplot2,而对于graphics::plot,这可能不是问题。

    【讨论】:

    • +1,谢谢。好提示。 plot_expression 有时很乱,但这是我的代码的问题,您的建议是改善这种情况的一个很好的理由。
    猜你喜欢
    • 2018-06-04
    • 2022-01-06
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多