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

如何强制Knitr在所有其他代码块之后计算\Sexpr,r,latex,knitr,R,Latex,Knitr,我试图为动态文档编写摘要,但我的\Sexpr{}调用无效 基本上,我所要做的就是从一个抽象开始文档,该抽象包含从\Sexpr{value}生成的p值,其中值在文档中“下游”确定。比如说 这项工作: \begin{document} <<foo>>= value = 10 @ Today I bought \Sexpr{value} Salamanders \end{document} \begin{document} = 值=10 @ 今天我买了\Sexpr

我试图为动态文档编写摘要,但我的
\Sexpr{}
调用无效

基本上,我所要做的就是从一个抽象开始文档,该抽象包含从
\Sexpr{value}
生成的p值,其中值在文档中“下游”确定。比如说

这项工作:

\begin{document}

<<foo>>=
   value = 10
@

Today I bought \Sexpr{value} Salamanders

\end{document}
\begin{document}
=
值=10
@
今天我买了\Sexpr{value}蝾螈
\结束{document}
这不起作用(我正在努力实现)

\begin{document}
今天我买了\Sexpr{value}蝾螈
=
值=10
@

我看不到一个简单的解决方案,可以在对代码块求值之后推迟对
\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")
@
The answer is \Sexpr{answer}.
理解其工作原理的关键是认识到
knitr
在LaTeX之前处理文档。因此,LaTeX命令
\input{myabstract}
包括
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}
\documentclass{article}
\开始{document}
=

答案从直观的角度来看,这会引发一个错误,这是有道理的:您如何谈论尚未计算的对象的值

一种可能的解决方法是在之前运行代码块,但让
include=FALSE
,然后在以后重用代码块,请参阅

\begin{document}
%%#对代码进行求值,但输出中没有写入任何内容
=
值=10
阴谋(罪恶)
rnorm(5)
@
今天我买了\Sexpr{value}蝾螈
%%#这里的代码可以包含在输出中(图、回波、结果等)
=
@
\结束{document}

您可能需要在文档中运行两次,保存以后计算中需要的内容,并在开始时重新加载。这很正常。在第一个示例中,在\Sexpr{}中调用“value”之前定义了“value”;因此,它存在于您的工作空间中,可以调用。在第二个例子中,我们称之为不存在的变量;因此,您需要首先定义它,或者在它存在的地方加载一个工作空间。我认为可能有某种方法可以添加一些
eval
命令,将夹头缓存到更高的
\Sexp
中。如果我理解正确的话,Knitr正在使用Latexmk运行LaTeX代码(多次)?不涉及Latexmk或多次运行。document.Rnw中的块按给定顺序逐个执行。最后一个块将myabstract.Rnw编织成myabstract.tex(试试!)。请注意,调用knit()的环境中可用的所有对象都可以在编织的文档中使用。因此,在编织myabstract.Rnw时,对象
答案
可用。完成所有编织后,通常的TEX工具链将mydocument.TEX编译为PDF。在这一点上,myabstract.tex是存在的,可以在适当的地方包括在内。谢谢,这非常有用。我不知道你可以像这样回收块。谢谢您的回答。@Eric注意,对于区块重用,有一种更简洁的语法,请参阅参考文档页或上面我回答的第二部分。
\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}
\begin{document}

%%# Code is evaluated but nothing is written in the output
<<foo, include=FALSE>>=
    value = 10
    plot(sin)
    rnorm(5)
@

Today I bought \Sexpr{value} Salamanders

%%# Here code can be included in the output (figure, echo, results etc.)
<<bar>>=
<<foo>>
@

\end{document}