我已经在不同的论坛上搜索过,但直到现在我还是找不到解决方案。所以我希望你能帮助我……
正如标题所述,在由 \whiledo 循环包装的代码块中,变量 x 没有增加。让我们看看我的代码:
\documentclass[10pt, a4paper]{article}
\usepackage{ifthen}
\usepackage{pifont}
\begin{document}
\SweaveOpts{concordance=TRUE}
\newcounter{ctra}
\setcounter{ctra}{1}
\whiledo {\value{ctra} < 7}
{
<<echo=FALSE, results=hide>>=
if(!exists("x")){x=numeric()}
if(length(x)==0)
{
x=2
}else{
x=x+1
}
@
\Sexpr{x} \\
\stepcounter{ctra}
}
\end{document}
当我现在在 RStudio 中编译脚本时,我得到了一个包含一堆 2 的 pdf,但我期望得到的是 2、3、4、5、6 和 7 这样的数字序列。
有人能给我一些提示来解决这个问题吗?如有必要,请解释一下背景,因为我对 Sweave 不是很有经验。
在这里我第一次编辑我的问题……
我需要将这个数字系列的正确数据放入我的表格中。两个表格行的代码将是这样的
\setlength{\arrayrulewidth}{1pt}
\begin{tabular}{|p{3.5cm}*{5}{p{1.75cm}}|}
\hline
\textbf{Stab} & \textbf{\ctab Spr \Sexpr{vers[1]}} & \textbf{\ctab Spr \Sexpr{vers[2]}} & \textbf{\ctab Spr \Sexpr{vers[3]}} & \textbf{\ctab Spr \Sexpr{vers[4]}} & \textbf{\ctab Spr \Sexpr{vers[5]}} \\
\hline
\rowcolor[gray]{0.7}
\hspace{0.5cm}Dampf [-] & \ctab \Sexpr{Drsp[[1]][vers[1]]} & \ctab \Sexpr{Drsp[[1]][vers[2]]} & \ctab \Sexpr{Drsp[[1]][vers[3]]} & \ctab \Sexpr{Drsp[[1]][vers[4]]} & \ctab \Sexpr{Drsp[[1]][vers[5]]} \\
\hspace{0.5cm}MaUbschw [bar] & \ctab \Sexpr{Drsp[[2]][ vers[1]]} & \ctab \Sexpr{Drsp[[2]][vers[2]]} & \ctab \Sexpr{Drsp[[2]][vers[3]]} & \ctab \Sexpr{Drsp[[2]][vers[4]]} & \ctab \Sexpr{Drsp[[2]][vers[5]]} \\
% and so on...
\hline
\end{tabular}
但是我上面加载的数据(在脚本中)的行数很高(最多 200 行)。数据文件与 R data.frame 相当。
我的数据中的一行将是我的表中的一列。
太多了,无法只放在一个表中。我的解决方案是循环遍历表并创建一个只有 5 列的表。在 pdf 中,我将一些表一个接一个地放在一起。
因此我创建了一个具有行数的向量。
vers=c(1:nrow(Drsp)) # R-code
在第一个循环中,向量的第一个元素将用于填充 5 列表格。因为我有 5 列,所以我可以在进入第二个循环之前“缩短”向量。
vers=vers[-c(1:5)] # R-code
对于第二张表,我在向量的前 5 个元素中有正确的数据。
我想现在是时候看看我的复合代码了:
\documentclass[10pt, a4paper]{article}
\usepackage{ifthen}
\usepackage{pifont}
% Centering in the table
\newcommand{\ctab}{\centering\arraybackslash}
\begin{document}
\SweaveOpts{concordance=TRUE}
<<echo=FALSE, results=hide>>=
# Load the required data
Drsp=read.csv2(file="F:\\Testfile.csv”,header=TRUE)
# Create the vector
vers=c(1:nrow(Drsp))
@
\newcounter{ctra}
\setcounter{ctra}{1}
\whiledo {\value{ctra} < \Sexpr{nrow(Drsp)}}
{
<<echo=FALSE, results=hide>>=
if(!exists("x")){x=numeric()}
if(x>=1){vers=vers[-c(1:5)]} # shorten my vector in every loop
if(length(x)==0)
{
x=1
}else{
x=x+1
}
@
% table with the right data, because every loop the vector will be shorten
\setlength{\arrayrulewidth}{1pt}
\begin{tabular}{|p{3.5cm}*{5}{p{1.75cm}}|}
\hline
\textbf{Stab} & \textbf{\ctab Spr \Sexpr{vers[1]}} & \textbf{\ctab Spr \Sexpr{vers[2]}} & \textbf{\ctab Spr \Sexpr{vers[3]}} & \textbf{\ctab Spr \Sexpr{vers[4]}} & \textbf{\ctab Spr \Sexpr{vers[5]}} \\
\hline
\rowcolor[gray]{0.7}
\hspace{0.5cm}Dampf [-] & \ctab \Sexpr{Drsp[[1]][vers[1]]} & \ctab \Sexpr{Drsp[[1]][ vers[2]]} & \ctab \Sexpr{Drsp[[1]][ vers[3]]} & \ctab \Sexpr{Drsp[[1]][ vers[4]]} & \ctab \Sexpr{Drsp[[1]][ vers[5]]} \\
\hspace{0.5cm}MaUbschw [bar] & \ctab \Sexpr{Drsp[[2]][ vers[1]]} & \ctab \Sexpr{Drsp[[2]][ vers[2]]} & \ctab \Sexpr{Drsp[[2]][ vers[3]]} & \ctab \Sexpr{Drsp[[2]][ vers[4]]} & \ctab \Sexpr{Drsp[[2]][ vers[5]]} \\
% and so on...
\hline
\end{tabular}
\addtocounter{ctra}{5} % because of the 5 table columns
} % End whiledo loop
\end{document}
好的,我希望我做的一切都正确……
如果有更简单的方法可以实现我的目标,请告诉我;-)
提前谢谢了!
答案1
Sweave 通过忽略所有 LaTeX 代码并执行 R 代码来处理源文件。这意味着 LaTeX 循环中的代码将仅由 R 执行一次。在生成的.tex
代码中,任何\Sexpr
变量都将被替换为单次运行后的值,在本例中\Sexpr{x}
被替换为字符串2
。随后运行 LaTeX 时,将执行循环并2
多次打印字符串。
另外,你也可以将循环放在 R 中,然后从那里编写所需的 LaTeX 代码。MWE(另存为.Snw
,从 R 内部运行Sweave("yourfile.Snw")
,然后编译生成的yourfile.tex
):
编辑:新的 Snw 文件,同样的想法,代码稍微复杂一些
调整至合适的大小。将其转换\
为\\
,并将 放在\n
您想要换行的位置。
\documentclass{article}
\begin{document}
<<results=tex,echo=FALSE>>=
lines_per_table <- 5
cols_per_table <- 4
Drsp <- matrix(rexp(100, rate=.1), ncol=20)
vers <- c(1:ncol(Drsp))
for(x in seq(0,ncol(Drsp),lines_per_table)){
cat("\\begin{tabular}{l|ccccc|}\n")
cat("\\hline\n")
cat("\\textbf{Stab} ")
for(y in seq(cols_per_table)){
cat("& Spr",vers[y])
}
cat("\\\\\n")
cat("\\hline\n")
for(y in seq(lines_per_table)){
cat("line",y)
for(z in seq(cols_per_table)){
cat("&",Drsp[y,vers[z]])
}
cat("\\\\\n")
}
cat("\\hline\n")
cat("\\end{tabular}\n\n")
vers <- vers[-c(1:cols_per_table)]
}
@
\end{document}
结果:
ETC。
结束编辑
你的文件
\documentclass{article}
\begin{document}
\noindent
<<results=tex,echo=FALSE>>=
for(x in seq(7)){
cat("x is \\textbf{",x,"}\\\\",sep="")
}
@
\end{document}
注意results=tex
选择。
自动生成 yourfile.tex
\documentclass{article}
\usepackage{Sweave}
\begin{document}
\noindent
x is \textbf{1}\\x is \textbf{2}\\x is \textbf{3}\\x is \textbf{4}\\x is \textbf{5}\\x is \textbf{6}\\x is \textbf{7}\\\end{document}
结果:
x 是1
x 是2
x 是3
x 是4
x 是5
x 是6
x 是7