knitr中未评估的块会产生换行符

时间:2017-07-27 14:17:10

标签: r latex knitr sweave

以下Rnw文件生成如下所示的输出。是否有一种干净的方法来阻止第2节中的换行? 当然,这只是一个可重复性最小的例子;我不想删除未经评估的块,这在我的实际问题中是以编程方式评估的。

\documentclass{article}

<<setup, include=FALSE>>=
knitr::opts_chunk$set(echo = FALSE)
@

\begin{document}

\section{eval TRUE}

<<results='asis'>>=
cat("Hello.")
@
<<eval=TRUE, results='asis'>>=
cat("How are you?")
@
What's your name?


\section{eval FALSE}

<<results='asis'>>=
cat("Hello.")
@
<<eval=FALSE, results='asis'>>=
cat("How are you?")
@
What's your name?

\end{document}

enter image description here

修改

到目前为止我有一个解决方案:

<<results='asis'>>=
cat("Hello.")
if(FALSE) cat("How are you?")
@
What's your name?

但是我想知道是否有一个更简单的,不需要像这样将一个块分组。

1 个答案:

答案 0 :(得分:1)

有趣的是,无论所有选项如何,knitr显然都会为每个块打印至少一个换行符(即使eval = FALSE, echo = FALSE, results = "hide")。因此,以下只是一种解决方法,但可能是一个比问题更简洁的解决方法:

在块中使用if(代替块选项eval)但如果不应该评估块,则打印%。这将使TEX忽略该行。

\documentclass{article}

<<setup, include=FALSE>>=
  knitr::opts_chunk$set(echo = FALSE)
  showIt <- FALSE
@

\begin{document}

\section{eval FALSE}

<<results='asis'>>=
  cat("Hello.")
@
<<results='asis'>>=
  if(showIt) {
    cat("How are you?")
  } else {
    cat("%")
  }
@
What's your name?

\end{document}