通过 knitr 有条件地打印带有内联 R 数据的文本

通过 knitr 有条件地打印带有内联 R 数据的文本

我想有条件地打印包含 的句子\Sexpr{}knitr该怎么做?我知道我可以使用有条件地打印文本,\Sexpr{}但是当要打印的文本包含其自身时,我会遇到问题\Sexpr{}

这是一个不起作用的例子,但是它演示了我想要做的事情:

\documentclass{article}

\begin{document}

<<>>=
if(rnorm(1) > 0) x = rbinom(1, 100, 0.5) else x = 0
big_number = x>0
@

This LaTeX is fun! \Sexpr{if(big_number) I wish I could use it \Sexpr{x} times a day!}

\end{document}

一半的时间x会是一个大数字,一半的时间会是 0。如果它是一个大数字,我只想打印第二句话。

因此,生成的 PDF 要么包含This LaTeX is fun!(当 x<0 时),要么包含This LaTeX is fun! I wish I could use it 50 times a day!(当 x>0 时)。我永远不希望它打印This LaTeX is fun! I wish I could use it 0 times a day!

需要说明的是,这只是一个用来说明该原理的例子。

我看到这个答案https://stackoverflow.com/questions/23437854/knitr-latex-conditional-display-of-text-and-code-block作为一种潜在的解决方案,但我需要对单个文档执行此操作 10-20 次,并且我不希望为每个小节制作 10-20 个文件......

答案1

  • 根据您的澄清进行修改。

您遇到的问题是\Sexpr无法嵌套,这是因为 R 的求值方式和 LaTeX 的求值方式不同。但我已经实现了我认为您想要的功能。

根据您的修订,条件必须全部在 R 内部完成,如下所示:

\documentclass{article}
\begin{document}

<<echo=FALSE, results='asis', warning = FALSE>>=
z=rnorm(1)
if(z > 0) {cat(paste("This \\LaTeX is fun! I wish I could use it ", rbinom(1, 100, 0.5)," times a day!"))} else {cat(paste("This \\LaTeX is fun!"))}
@

![\bigskip

<<echo=FALSE, results='asis', warning = FALSE>>=
z=rnorm(1)
if(z > 0) {cat(paste("This \\LaTeX is fun! I wish I could use it ", rbinom(1, 100, 0.5)," times a day!"))} else {cat(paste("This \\LaTeX is fun!"))}
@][3]
\end{document}

结果是:

在此处输入图片描述

答案2

这个解决方案稍微简洁一些。它将应该始终打印的文本留在块之外(以避免混淆),并在块内创建一个字符串,该字符串可以\Sexpr{}在文本中有条件地打印。

\documentclass{article}

\begin{document}

<<>>=
if(rnorm(1) > 0) x = rbinom(1, 100, 0.5) else x = 0
big_number = x>0
text=paste('I wish I could use it',x,'times a day!')
@

This LaTeX is fun! \Sexpr{if(big_number) text}

\end{document}

相关内容