如何强制Knitr在所有其他代码块之后评估\ Sexpr

Sam*_*Sam 5 latex r knitr

我正在尝试为动态文档编写摘要,但我的\Sexpr{}调用不起作用.

基本上我所要做的就是用一个抽象来启动文档,该抽象具有从\Sexpr{value}文档中"下游"确定值的位置生成的p值.例如

这有效:

\begin{document}

<<foo>>=
   value = 10
@

Today I bought \Sexpr{value} Salamanders

\end{document}
Run Code Online (Sandbox Code Playgroud)

这不起作用(以及我想要实现的目标)

\begin{document}

Today I bought \Sexpr{value} Salamanders

<<foo>>=
  value = 10
@
Run Code Online (Sandbox Code Playgroud)

CL.*_*CL. 4

我没有看到一个简单的解决方案来推迟对\Sexpr代码块求值后的求值,但它仍然很容易\Sexp与稍后定义的值一起使用,例如,摘要:myabstract.Rnw对摘要使用单独的文件 ( ),\input{myabstract}在其中添加摘要应该包含knit myabstract.Rnw在主文档的最后:

document.Rnw

\documentclass{article}
\begin{document}

\begin{abstract}
  \input{myabstract}
\end{abstract}

Main text.

<<>>=
answer <- 42
@

\end{document}

<<include = FALSE>>=
knit("myabstract.Rnw")
@
Run Code Online (Sandbox Code Playgroud)

myabstract.Rnw

The answer is \Sexpr{answer}.
Run Code Online (Sandbox Code Playgroud)

理解其工作原理的关键是knitr要先于 LaTeX 处理文档。\input{myabstract}因此,LaTeX 命令包含myabstract.tex“before”(不是指时间而是指行号)并不重要,knit("myabstract.Rnw")生成myabstract.tex.


对于更复杂的场景,可以将评估和输出分开:在早期块中进行所有计算并在其所属位置打印结果。要显示源代码,请重用块(设置eval = FALSE)。使用上面的示例,这意味着:

\documentclass{article}
\begin{document}

<<calculation, include = FALSE>>=
answer <- 42
@

\begin{abstract}
  The answer is \Sexpr{answer}.
\end{abstract}

Main text.

<<calculation, eval = FALSE>>=
@

\end{document}
Run Code Online (Sandbox Code Playgroud)