为什么波形标记<< >> =在表格环境中不起作用?

问题描述

我与R斗争并且在表格环境中弯曲。我想根据内容进行单元格标记。因此,我在表格环境中尝试了一个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","x3"] <- c("1","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,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","x2"]}\% &
      <<results=tex,eval=true>>=
        if(1==1) cat("\\cellcolor{markRed}")
      @
      \Sexpr{df1[df1$Indicator=="A1",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","x2"]}\% &
<<results=tex,eval=true>>=
        if(1==1) cat("\\cellcolor{markRed}")
@
      \Sexpr{df1[df1$Indicator=="A1","x3"]}\\

对于它的价值,如果使用knitr::knit而不是Sweave(),则块标记的缩进无关紧要。不过,您需要进行其他更改,例如

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

将成为

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

因为块选项被评估为好像它们是R表达式。一般来说,我建议您进行切换:knitr在许多方面都更好。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...