knitr 中 R 代码块和 LaTeX 的全局变量

Posted

技术标签:

【中文标题】knitr 中 R 代码块和 LaTeX 的全局变量【英文标题】:Global variable in knitr for both R code Chunks and LaTeX 【发布时间】:2015-09-29 11:33:12 【问题描述】:

我正在尝试创建一个可以在 R 代码块和 LaTeX 中的 knitr 文档中使用的数字变量(在代码中:称为 nClusters)。下面的代码中有一个示例。

在这里,我初始化数值变量 nClusters 并将其赋值为 7。稍后,在文档中,我在 R 代码块中调用它,这似乎可以正常工作。但是,然后我尝试在 LaTeX 部分(在 R 代码块之外)调用它,这会导致问题:

\documentclassarticle
\usepackagefloat, hyperref
\usepackage[margin=1in]geometry
\usepackagepgffor

\begindocument

<<options, echo=FALSE>>=
nClusters = 7 # I only want to define nClusters once
library(knitr)
opts_chunk$set(concordance=TRUE)
@

<<echo=FALSE,eval=TRUE,results='asis'>>=
# Here the call to nClusters works
for (i in 2:nClusters)
  print(paste("This is number",i))

@

% Here the call to nClusters does not work
\begincenter
\foreach \i in 2,3,...,nClusters 
  Hello \i\

\endcenter

\enddocument

当我编织这个时,我得到以下输出:

什么时候输出应该是:

在对变量的 LaTeX 调用中出现差异,因为如果我在 7 中进行硬编码,那么它就可以工作。因此,我的问题是:是否可以在 knitr 中创建一个可以在 R 代码块和 LaTeX 部分中调用的全局变量?

【问题讨论】:

我猜这是foreach 问题。通常来说,R 变量是通过$\SexprnClusters$ 访问的,但不确定这在这种情况下是否可行,你应该试一试! 【参考方案1】:

使用 pgffor 时,

\foreach <variables> in <list> <commands>

是逗号分隔的值列表。任何东西都可以用作值。如果您尝试使用以下代码,则此处的变量不会传递给脚本的 LATEX 部分:

\begincenter
\foreach \i in 2,3,...,C 
  Hello \i\

你得到

[1] ”This is number 2” [1] ”This is number 3” [1] ”This is number 4” [1] ”This is number 5” [1] ”This is
number 6” [1] ”This is number 7”
Hello 2 Hello 3 Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ?
Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ?
Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ?
Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ?
Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ? Hello ?
Hello ? Hello ? Hello Hello A Hello B Hello C

哪个是2,3开头C结尾的序列,不知道'?'里面打印出什么字符

您会产生完全相同的结果。要评估 R 块之外的变量,您需要使用 Sexpr

\begincenter
\foreach \i in 2,3,...,\SexprnClusters 
  Hello \i\

产生

【讨论】:

以上是关于knitr 中 R 代码块和 LaTeX 的全局变量的主要内容,如果未能解决你的问题,请参考以下文章

R,knitr不尊重块和文本的顺序

每次我尝试使用来自R的块代码在Texmaker中运行Latex文档时,我都会收到错误

使用 R markdown 和 knitr:可以在 YAML 中解释 R 对象

.Rnw 文件 (LaTeX) 中的 knitr 语法高亮显示

使用 KnitR 以编程方式在 R 中创建 Markdown 表

在 R-Markdown 中使用 knitr 和 kableExtra 的表格单元格中的乳胶公式或符号,