Sweave 中的自定义图形设备

Custom graphical device in Sweave

我的 已通过在 Sweave 本身之外创建 pdf 图然后导入它来解决。

根据 Sweave 文档,我编写了一个自定义图形设备,它应该以完全相同的方式构造 pdf 图形。但是它不起作用。你能解释一下为什么下面 Sweave 文档的第二个图形不起作用,而它应该与第一个完全一样创建吗?我认为它应该是错的吗?

\documentclass{article}

\begin{document}
\SweaveOpts{concordance=TRUE}

<<setup, echo=FALSE>>=
mycairo <- function(name, width = 7, height = 7, ...) { 
  grDevices::cairo_pdf(name, width = width, height = height)
}
mycairo.off <- function() {
    cat("shutting down mycairo\n")
    invisible(grDevices::dev.off())
}
@

\section{Export plot}

<<Export_plot, echo=FALSE>>=
cairo_pdf("exported_plot.pdf")
par(mar=c(6,7,0,6))
ylab <- expression(paste("", bar(italic("\u2113")), "(",phi[0], "|", italic(list(x,y)), ")"))
plot(0,0, ylab=ylab, xlab=NA, cex.lab=3)
invisible(dev.off())
@

% insert exported plot 
\includegraphics[width=6cm]{exported_plot.pdf}


\section{Direct plot}

<<mycairo_plot, echo=FALSE,  fig=TRUE, pdf=TRUE, grdevice=mycairo, width=4, height=4>>=
par(mar=c(6,6,0,6))
ylab <- expression(paste("", bar(italic("\u2113")), "(",phi[0], "|", italic(list(x,y)), ")"))
plot(0,0, ylab=ylab, xlab=NA, cex.lab=1)
@


\end{document}

@user20650 好心建议我将 his/her 评论中给出的答案转换为官方答案。

cairo_pdf函数中包含pdf文件扩展名就可以了。然后将 mycairo 函数替换为:

mycairo <- function(name, width = 7, height = 7, ...) { 
  grDevices::cairo_pdf(sprintf("%s.pdf", name), width = width, height = height)
}

作为旁注,您也可以将其设置为全局选项,而不是在每个图形块中指定 grdevice=mycairo

\SweaveOpts{grdevice=mycairo}