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

Я пишу отчет в 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} 

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


person Sam    schedule 27.08.2012    source источник


Ответы (2)


Вы можете использовать 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 форме, потребовалось несколько изменений в коде, который также включен ниже.)

введите здесь описание изображения

\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}
person Josh O'Brien    schedule 27.08.2012
comment
Замечательный. Очень хороший ответ. Ваш ответ дал мне хорошую идею для многих других проблем, о которых я думал некоторое время. - person Sam; 28.08.2012
comment
@Sepehr -- Использовался ли бит capture.output() ключа? - person Josh O'Brien; 28.08.2012
comment
Это было. Я не знал, что функция существует. Теперь я могу легко настроить свои таблицы. Еще раз большое спасибо за вашу помощь. - person Sam; 28.08.2012
comment
Предполагается ли, что это работает, когда 'knitr' загружается в сеансе консоли, а приведенный выше код вставляется с кавычками внутри knit()? - person IRTFM; 30.08.2012
comment
@DWin -- Нет. Рабочий процесс похож на Sweave в том смысле, что вы: (1) помещаете код в файл (называя его, например, "eg.Rnw"); (2) выполнить knit("eg.Rnw") (возможно, из сеанса консоли); затем (3) запустите LaTeX на "eg.tex", полученный файл *.tex. - person Josh O'Brien; 30.08.2012
comment
Должен ли Hmisc::latex(knit(readLines("eg.Rnw")) работать? Предполагая, конечно, что eg.Rnw находится в рабочем каталоге. - person IRTFM; 30.08.2012
comment
@Dwin - Согласно ?knit, этот аргумент input должен быть путем к входному файлу, поэтому knit(readLines("eg.Rnw")) не будет работать, а knit("eg.Rnw") будет. Не уверен, что вы пытаетесь сделать, но, возможно, этот интересный сценарий (ссылка Yihui в его ответе на этот вопрос SO) даст вам несколько идей. - person Josh O'Brien; 30.08.2012
comment
Спасибо, я посмотрю на это, но читатели этого диалога НЕ должны ожидать, что Hmisc::latex(knit(eg.Rnw)) будет работать, если только они не ожидают хорошую латексную таблицу с одной записью, например.Rnw. Я предполагаю, что latex() дается имя файла как значение вызова knit(). - person IRTFM; 30.08.2012

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

\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}
person jfreels    schedule 30.08.2013