knitr中的全局变量:针对R代码块和LaTeX,如何实现?

4
我正在尝试创建一个数值变量(在代码中称为nClusters),可以在knitr文档中的R代码块和LaTeX中使用。以下是示例代码:
在此,我初始化并将数字变量nClusters分配给7的值。稍后,在文档中,我在R代码块中调用它,这似乎可以正常工作。但是,我随后尝试在LaTeX部分(在R代码块之外)中调用它,这会导致问题:
\documentclass{article}
\usepackage{float, hyperref}
\usepackage[margin=1in]{geometry}
\usepackage{pgffor}

\begin{document}

<<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
\begin{center}
\foreach \i in {2,3,...,nClusters} {
  Hello \i\
}
\end{center}

\end{document}

当我编织时,会得到以下输出: Current output 然而,这个输出应该是这样的: Desired output 这个差异是在LaTeX调用变量时发生的,因为如果我硬编码7,则可以正常工作。因此,我的问题是:是否可能在knitr中创建一个全局变量,以便在R代码块和LaTeX部分都可以调用?

我猜这是一个foreach的问题。通常来说,R变量可以通过$ \Sexpr {nClusters} $进行访问,但不确定在这种情况下是否有效,你应该尝试一下并确认! - ClementWalter
1个回答

0

使用pgffor时,

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

是一个由逗号分隔的值列表。任何东西都可以用作值。在这里,您的变量未传递到脚本的LATEX部分,如果您尝试使用以下代码:

\begin{center}
\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 {}

\begin{center}
\foreach \i in {2,3,...,\Sexpr{nClusters}} {
  Hello \i\
}

它产生

right answer


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