Пользовательское графическое устройство в Sweave


Моя Проблема вставки pdf-графика со специальным символом в документ Sweave была решена путем создания PDF-графика вне самого Sweave, а затем его импорта.

Следуя документации 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 mycairon")
    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}

Введите описание изображения здесь

1 4

1 ответ:

@user20650 любезно предложил мне преобразовать ответ, данный в его комментарии, в официальный.

Достаточно включить расширение файла pdf в функцию cairo_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}