为什么 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
在很多方面都更好。
我在表格环境中与 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
在很多方面都更好。