为什么 sweave 标记 (<<>>=) 在表格环境中不起作用?

Why is sweave markup (<<>>=) not working in tabular environment?

我在表格环境中与 R 和 sweave 作斗争。我想根据内容进行单元格标记。因此,我在表格环境中尝试了 if 条件,但没有成功。

<<results=tex,echo=false, eval=true>>=
   if(1==1) cat("\cellcolor{markRed}")
@

不会被评估,我不知道为什么会这样。

你能指导我解决我的问题吗?

注意:我不想为 xtable 提供便利,因为我想要清楚地将计算和演示分开(用于计算的 r 脚本和用于演示的相当“愚蠢”的 rnw 文件)。

谢谢你和最诚挚的问候, 卡尔

最小工作示例:

\documentclass{article} 
\usepackage{times} 

\usepackage{multirow,colortbl,xcolor}
\usepackage{booktabs} % for midrule in tables
\usepackage{threeparttable}  % for footnotes in tables

\definecolor{markRed}{rgb}{1.0, 0.01, 0.24}

\begin{document} 
\SweaveOpts{concordance=TRUE}

<<echo=false>>=
 df1=data.frame(Indicator=c("A1", "B2", "C3"))
 df1[, "x1"] <- c("1", "2", "3")
 df1[, "x2"] <- c("1", "2", "3")
 df1[, "x3"] <- c("1", "2", "3")
 
@ 
\section{Working example}
\begin{threeparttable}
\begin{tabular}{llcrrr}
\textbf{Class} & \textbf{Id} & \textbf{w} & \textbf{x1} & \textbf{x2}\tnote{1} & \textbf{x3} \
\toprule
foo &
  foo & 
      $\frac{1}{6}$ &
      \Sexpr{df1[df1$Indicator=="A1", "x1"]}\% &
      \Sexpr{df1[df1$Indicator=="A1", "x2"]}\% &
      \Sexpr{df1[df1$Indicator=="A1", "x3"]}\
<<results=tex,echo=false, eval=true>>=
 cat("bar & bar & $\frac{1}{6}$ & 4 & ")
 if(1==1) cat("\cellcolor{markRed}")
 cat("4 & 4 \\")
@ 
\end{tabular}%
\begin{tablenotes}
 \item[1] a note.
\end{tablenotes}
\end{threeparttable}

\section{Not Working example}
\begin{threeparttable}
\begin{tabular}{llcrrr}
\textbf{Class} & \textbf{Id} & \textbf{w} & \textbf{x1} & \textbf{x2}\tnote{1} & \textbf{x3} \
\toprule
foo &
  foo & 
      $\frac{1}{6}$ &
      \Sexpr{df1[df1$Indicator=="A1", "x1"]}\% &
      \Sexpr{df1[df1$Indicator=="A1", "x2"]}\% &
      <<results=tex,echo=false, eval=true>>=
        if(1==1) cat("\cellcolor{markRed}")
      @
      \Sexpr{df1[df1$Indicator=="A1", "x3"]}\
<<results=tex,echo=false, eval=true>>=
 cat("bar & bar & $\frac{1}{6}$ & 4 & ")
 if(1==1) cat("\cellcolor{markRed}")
 cat("4 & 4 \\")
@ 
\end{tabular}%

\begin{tablenotes}
 \item[1] a note.
\end{tablenotes}
\end{threeparttable}

\end{document} 

使用Sweave()时,块标记需要在第1列。所以你需要改变这个

      $\frac{1}{6}$ &
      \Sexpr{df1[df1$Indicator=="A1", "x1"]}\% &
      \Sexpr{df1[df1$Indicator=="A1", "x2"]}\% &
      <<results=tex,echo=false, eval=true>>=
        if(1==1) cat("\cellcolor{markRed}")
      @
      \Sexpr{df1[df1$Indicator=="A1", "x3"]}\

对此:

      $\frac{1}{6}$ &
      \Sexpr{df1[df1$Indicator=="A1", "x1"]}\% &
      \Sexpr{df1[df1$Indicator=="A1", "x2"]}\% &
<<results=tex,echo=false, eval=true>>=
        if(1==1) cat("\cellcolor{markRed}")
@
      \Sexpr{df1[df1$Indicator=="A1", "x3"]}\

不管怎样,如果您使用 knitr::knit 而不是 Sweave(),块标记的缩进并不重要。不过,您需要进行其他更改,例如

<<results=tex,echo=false, eval=true>>=

会变成

<<results="asis",echo=FALSE, eval=TRUE>>=

因为块选项的计算就像它们是 R 表达式一样。一般来说,我建议进行转换:knitr 在很多方面都更好。