在由 \whiledo 循环包装的 Sweave 代码块中,变量没有增量

在由 \whiledo 循环包装的 Sweave 代码块中,变量没有增量

我已经在不同的论坛上搜索过,但直到现在我还是找不到解决方案。所以我希望你能帮助我……

正如标题所述,在由 \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

相关内容