我想有条件地打印包含 的句子\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}