问题描述
我与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
在许多方面都更好。