使用knitr编译PDF时,不需要的R代码回显

时间:2015-06-15 12:08:36

标签: r pdf latex knitr sweave

我有一个.Rnw文件,其中包含以下代码。运行knitr::knit()一次,R代码不会回显。第二次运行knitr::knit(),R代码在PDF中回显。为什么?如何防止R代码回显?

<<load_chapter_2, echo=FALSE, warning=FALSE, message=FALSE,cache=TRUE>>=

options(digits=2)

opts_chunk$set(eval=TRUE, results = "hide", echo=FALSE, warning=FALSE, message=FALSE, fig.height=5, fig.width=5, fig.pos="!ht", fig.align='center')

@


\documentclass[a4paper,11pt]{article}

\usepackage{lipsum} % Required to insert dummy text

% \usepackage{nameref} commented out as was causing extra \else error

\usepackage{graphicx}

\usepackage{placeins} % to control figure placement with \FloatBarrier

\usepackage{xspace}

\usepackage{caption}

\usepackage{subcaption}

\usepackage{array} % for line breaks in table

\usepackage[comma, sort&compress]{natbib} 
\setlength{\bibsep}{0pt plus 0.3ex}


\begin{document}
\title{}
\author{}
\date{\today}
\maketitle

\section{Header}

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

<<plot_1>>=

plot(1)

@
\FloatBarrier


\end{document}

2 个答案:

答案 0 :(得分:3)

你不应该缓存你的设置块 - 这意味着你的optionsopts_chunk$set不会在knit()的后续调用中运行。 cache = TRUE应该用于产生结果的代码块,如果代码没有改变,结果也不会改变。但是,您还需要注意依赖关系。

有关详细信息,请参阅http://yihui.name/knitr/demo/cache/。请特别注意标有&#39;重要说明&#39;的部分。其中包括:

  

非常重要的是要注意通常是一块有   不应缓存副作用。虽然knitr试图保留   print()的副作用,还有其他副作用   没有保留。以下是一些不得使用缓存的情况   块:

     
      
  1. 设置options('width')pdf.options()等R选项或opts_chunk$set()opts_knit$set()等编织器中的任何其他选项   knit_hooks$set()
  2.   
  3. 通过library()在缓存的块中加载包,这些包将由未缓存的块使用(加载完全可以)   缓存块中的包,仅在缓存块中使用它们,因为   knitr保存缓存块的包列表,但未缓存   块无法知道先前缓存中加载了哪些包   组块)
  4.         

    否则,下次将跳过块并将所有设置中的   它会被忽略。您必须明确使用cache=FALSE   块。

答案 1 :(得分:2)

您必须设置cache = F。我认为原因是cache = TRUE第二次将代码存储在内存中并忽略echo = F