Sté*_*ent 5 pdf graphics r utf-8 sweave
我在 Sweave 文档中插入带有特殊字符的 pdf 图形的问题已通过在 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}
Run Code Online (Sandbox Code Playgroud)

@user20650 善意地建议我将他/她评论中给出的答案转换为官方答案。
在函数中包含pdf文件扩展名就足够了cairo_pdf。然后将该mycairo函数替换为:
mycairo <- function(name, width = 7, height = 7, ...) {
grDevices::cairo_pdf(sprintf("%s.pdf", name), width = width, height = height)
}
Run Code Online (Sandbox Code Playgroud)
作为旁注,grdevice=mycairo您也可以将其设置为全局选项,而不是在每个图形块中指定:
\SweaveOpts{grdevice=mycairo}
Run Code Online (Sandbox Code Playgroud)