在创建变量的代码块之前使用R变量

3
我希望在摘要中包含一个 R 计算结果。这个 R 计算结果位于文档底部,所以当我编译 Rnw 文件时出现了错误。
以下是一个最小的示例:
\documentclass{article}
\begin{document}

\begin{abstract}
    This paper... and we got a mean of \Sexpr{mean.data}.
\end{abstract}

<<>>=
data <- c(1,2,3,4,5)
mean.data <- mean(data)
@

\end{document}

目前,knitr按线性方式执行代码块和内联表达式,因此您无法使用“future”对象;但是我可能会在未来提供一些东西,以允许您从未来缓存中加载对象,如果缓存数据库存在的话。 - Yihui Xie
我提供了以下示例:https://dev59.com/qXbZa4cB1Zd3GeqPFWQA#58104427 - Yihui Xie
4个回答

4

显然,您需要在使用之前移动定义,而不是在使用之后。因此,请尝试以下方式:

\documentclass{article}
\begin{document}

<<>>=
data <- c(1,2,3,4,5)
mean.data <- mean(data)
@

\begin{abstract}
    This paper... and we got a mean of \Sexpr{mean.data}.
\end{abstract}

\end{document}

代码块可以出现在几乎任何地方,包括 \begin{document} 之前。


是的,但对于类似摘要/概述之类的东西,能够从“未来”块中加载数据是有用的功能。Yihui的回复有一种缓存结果的方法,在这个上下文中非常有用。 - W7GVR
所以@Vincent的版本早了大约六年,这并��认我需�在使用之�计算�些东西的说法。�是有三���的方法�供选择。🤷�♂� - Dirk Eddelbuettel

3
您可以使用knitr::load_cache()函数,如在仓库https://github.com/yihui/knitr-examples的示例114-load-cache.Rmd中所示。以下是在您的情况下如何使用该函数:
\documentclass{article}
\begin{document}

\begin{abstract}
This paper... and we got a mean of \Sexpr{knitr::load_cache('test-a', 'mean.data')}.
\end{abstract}

<<test-a, cache=TRUE>>=
data <- c(1,2,3,4,5)
mean.data <- mean(data)
@

\end{document}

第一次编译此文档时,mean.data 将不可用,但当您重新编译文档时,将从缓存中读取。

2

如果您需要在摘要后显示计算结果,可以将结果保存到文件中,并在摘要中加载。您需要编译LaTeX文件两次。

\documentclass{article}
\begin{document}

\begin{abstract}
 This paper... and we got a mean of \Sexpr{load("a.RData"); mean.data}.
\end{abstract}

<<Computations>>=
data <- c(1,2,3,4,5)
mean.data <- mean(data)
save(mean.data, file="a.RData")
@

\end{document}

0

如果你在使用LaTeX,另一种方法是在LaTeX处理阶段重新排列输出的顺序。我在TeX Stack Exchange网站上提了一个类似的问题

这种方法使用filecontents(LaTeX)包来存储部分输出,并在以后重新播放它。在这种方法中,您的摘要实际上会在文档末尾定义,但位于其上方的所有内容将被存储在一个文件中,然后在LaTeX处理步骤中,在摘要之后重新插入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接