如何在使用dev.new()时在knitr Vignette中生成图形?

4
我的程序能够生成多张图像,有时甚至不止一张。
使用x11或windows设备并没有问题,knitr构建vignette时包括了图像。
然而,提交到CRAN存储库的要求是使用dev.new进行平台无关绘图。如果我用dev.new替换x11或windows,则我的vignette中不会出现任何图像。
是否有解决方法?起初,我认为这与在RStudio中绘图有关,但使用新参数dev.new(noRStudioGD = FALSE)并没有帮助。此外,从命令行构建软件包也没有解决问题。
顺颂商祺,
汤姆
(Windows 7 x64) (R 3.1.1) (RStudio 0.98.507)

2
通常情况下,您不需要自己打开设备,knitr会为您完成。您提到的设备是用于交互式使用的,那么您如何计划与运行在其自己的非交互式会话中的knitr进行交互? - baptiste
2个回答

2
简短回答是,您根本不需要使用dev.new() (或dev.off()或 dev.其他函数...)。如果您想要更长的答案,请提供一个最小可重现的示例来演示您实际遇到的问题。

谢谢Yihui和Baptiste,你们当然是对的,我根本不需要打开新设备。谢谢,Tom - Tom C
2
如果我有一个生成多个图形的分析函数怎么办?我需要使用dev.new()才能使其交互式工作。即使它只生成单个图形,我也希望我的函数不会覆盖以前的图形,而无需手动执行dev.new()...是否没有办法让这样的函数与knitr一起工作? - Eike P.

1

我也遇到了同样的困难。这里是一个可行的方法:

p1 <- function(x, knitr=FALSE){
    plot(x)
    if(!knitr) dev.new()
    plot(x^2)
}

参数knitr=仅在构建vignette时使用。

现在,在/vignettes中的.Rnw文件中写入以下内容:

%\VignetteEngine{knitr::knitr}
%\VignetteIndexEntry{p1}
\documentclass{article}

\begin{document}

<<setup, include=FALSE>>=
library("knitr")
### Set global chunk options
opts_chunk$set(eval=TRUE,
   ## text results
   echo=TRUE,
   results=c('markup', 'asis', 'hold', 'hide')[1],
   ## plots
   fig.path=c('figure', 'figure/minimal-')[1],
   fig.keep=c('high', 'none', 'all', 'first', 'last')[1],
   fig.align=c('center', 'left', 'right', 'default')[1],
   fig.show=c('hold', 'asis', 'animate', 'hide')[1],
   dev=c('pdf', 'png', 'tikz')[1],
   fig.width=7, fig.height=7, #inches
   fig.env=c('figure', 'marginfigure')[1],
   fig.pos=c('', 'h', 't', 'b', 'p', 'H')[1]
   )
@

<<plot1>>
library("myPackage")
x <- seq(10)
p1(x, knitr=TRUE)
@

\end{document}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接