Изменение цвета отрицательных чисел на красный в таблице, сгенерированной с помощью xxtable()?

Я пишу отчет в R с knitr. Я использую xtable() для генерации таблиц в отчете. Одна из моих таблиц включает как отрицательные, так и положительные числа. Я хотел бы изменить цвет отрицательных чисел на красный. Как я могу это сделать? Очевидно, что одним из простых решений является изменение латексного кода, который генерирует xtable. Но обратите внимание, что у меня есть автоматический отчет, который номера могут меняться с новыми наборами данных, и я не хочу вручную устанавливать цвета.

Вот простой код:

\documentclass{article}
\begin{document}
<<simpleExamp, results=tex, echo=FALSE>>=
library(knitr)
library(xtable)
testMatrix <- matrix(c(sample(-10:10,10)), ncol = 2)
xtable(testMatrix)
@
\end{document} 

Как я могу сделать отрицательные числа красным? Благодарим вас за помощь.

Ответы

Ответ 1

Вы можете использовать capture.output() для захвата строк, напечатанных (неявным) вызовом print.xtable(). Затем примените gsub() к выходу, используя шаблон и замену, которые окружают каждое отрицательное число с помощью \textcolor{red}{}. Наконец, используйте cat() с sep="\n", чтобы записать измененные строки в файл *.tex.

\documentclass{article}
\begin{document}
<<simpleExamp, results="asis", echo=FALSE>>=
library(knitr)
library(xtable)
testMatrix <- matrix(c(sample(-10:10,10)), ncol = 2)
## I added the following three lines
xt <- capture.output(xtable(testMatrix))
xt_mod <- gsub("(\\s|^)(-\\d*)", "\\1\\\\textcolor{red}{\\2}", xt)
cat(xt_mod, sep="\n")
@
\end{document}

(Заметим также, что я заменил results=tex на results="asis", который предпочитает knitr, и который он будет быстрее обрабатывать.)


Изменить: Добавление изображения итоговой таблицы. (Получение его в форме SO-ready потребовало нескольких настроек для кода, который также включен ниже.)

enter image description here

\documentclass{standalone}
\renewenvironment{table}{}{}% Ignore `table` environment in standalone mode.
\begin{document}
<<simpleExamp, results="asis", echo=FALSE>>=
library(knitr)
library(xtable)
cat("\\Huge\n\n")
testMatrix <- matrix(c(sample(-10:10,10)), ncol = 2)
## I added the following three lines
xt <- capture.output(print.xtable(xtable(testMatrix), table.placement=NULL))
xt_mod <- gsub("(\\s|^)(-\\d*)", "\\1\\\\textcolor{red}{\\2}", xt)
cat(xt_mod, sep="\n")
@
\end{document}

Ответ 2

Скопированный Джош О'Брайен ответил небольшим изменением цвета таблицы с десятичными знаками:

\documentclass{article}
\begin{document}
<<simpleExamp, results="asis", echo=FALSE>>=
library(knitr)
library(xtable)
testMatrix <- matrix(c(sample(-10:10,10)), ncol = 2)*1.1
## I added the following three lines
xt <- capture.output(xtable(testMatrix))
xt_mod <- gsub("(\\s|^)(-\\d\\.\\d*)", "\\1\\\\textcolor{red}{\\2}", xt)
cat(xt_mod, sep="\n")
@
\end{document}