2015-06-24 2 views
2

Я использую xtable для автоматического создания таблиц LaTeX и хотел бы заставить линию-перехват/перерыв в ячейках.Разрывы строк в ячейках xxtable

Это может быть сделан с помощью \newline в клетке, но у меня возникают проблемы, предотвращающий xtable от замены моей дробной черты (\) с $\backslash$.

Heres пример ....

library(magrittr) 
library(xtable) 
my.data <- cbind(c("1", "2", "3"), 
       c("0", "1", "2"), 
       c("2", "3", "4")) %>% 
      as.data.frame() 
## Generate output variable 
my.data$out <- paste0(my.data$V1, 
         " \\newline (", 
         my.data$V2, 
         " to ", 
         my.data$V3, 
         ")") 
## Check the data frame... 
my.data 
    V1 V2 V3     out 
1 1 2 3 1 \\newline (2 to 3) 
2 0 1 2 0 \\newline (1 to 2) 
3 2 3 4 2 \\newline (3 to 4) 
## Now generate xtable 
xtable(my.data) 
% latex table generated in R 3.2.0 by xtable 1.7-4 package 
% Wed Jun 24 11:51:59 2015 
\begin{table}[ht] 
\centering 
\begin{tabular}{rllll} 
    \hline 
    & V1 & V2 & V3 & out \\ 
    \hline 
1 & 1 & 2 & 3 & 1 $\backslash$newline (2 to 3) \\ 
2 & 0 & 1 & 2 & 0 $\backslash$newline (1 to 2) \\ 
3 & 2 & 3 & 4 & 2 $\backslash$newline (3 to 4) \\ 
    \hline 
\end{tabular} 
\end{table} 

paste0() работает отлично, как и ожидалось, но прохождение этого кадра данных в xtable не приводит к то, что я ожидал (/ надеялся), который ....

xtable(my.data) 
% latex table generated in R 3.2.0 by xtable 1.7-4 package 
% Wed Jun 24 11:51:59 2015 
\begin{table}[ht] 
\centering 
\begin{tabular}{rllll} 
    \hline 
    & V1 & V2 & V3 & out \\ 
    \hline 
1 & 1 & 2 & 3 & 1 \newline (2 to 3) \\ 
2 & 0 & 1 & 2 & 0 \newline (1 to 2) \\ 
3 & 2 & 3 & 4 & 2 \newline (3 to 4) \\ 
    \hline 
\end{tabular} 
\end{table} 

Так, чтобы при анализе через LaTeX я получал разрывы строк в этой ячейке.

Аналогичный вопрос о line breaks in captions предполагает использование двойных маскирования обратных косых черт, но это не работает в данном случае, либо ...

my.data$out <- paste0(my.data$V1, 
         " \\\\newline (", 
         my.data$V2, 
         " to ", 
         my.data$V3, 
         ")") 
% latex table generated in R 3.2.0 by xtable 1.7-4 package 
% Wed Jun 24 11:57:04 2015 
\begin{table}[ht] 
\centering 
\begin{tabular}{rllll} 
    \hline 
& V1 & V2 & V3 & out \\ 
    \hline 
1 & 1 & 2 & 3 & 1 $\backslash$$\backslash$newline (2 to 3) \\ 
    2 & 0 & 1 & 2 & 0 $\backslash$$\backslash$newline (1 to 2) \\ 
    3 & 2 & 3 & 4 & 2 $\backslash$$\backslash$newline (3 to 4) \\ 
    \hline 
\end{tabular} 
\end{table} 

Затем я посмотрел на xtablehelp и graph gallery и думал, что я мог бы быть в состоянии использовать sanitise.text.function, чтобы указать явно, чтобы заменить \ на \ (и тогда я мог бы просто использовать \newline в моем вызове paste0()), но, к сожалению, это не сработает, так как второй \ рассматривается как ускользающий от followin г закрытия двойные кавычки ...

xtable(my.data, sanitise.text.function = function(str)gsub("\", "\",str,fixed=TRUE)) 
Error: unexpected input in: 
"xtable(my.data, 
     sanitise.text.function = function(str)gsub("\", "\" 

Могу ли я использовать всю строку \newline и заменить его с собой?

my.data$out <- paste0(my.data$V1, 
         " \newline (", 
         my.data$V2, 
         " to ", 
         my.data$V3, 
         ")") 
xtable(my.data, sanitise.text.function = function(str)gsub("\newline", "\newline",str,fixed=TRUE)) 
% latex table generated in R 3.2.0 by xtable 1.7-4 package 
% Wed Jun 24 12:05:25 2015 
\begin{table}[ht] 
\centering 
\begin{tabular}{rllll} 
    \hline 
& V1 & V2 & V3 & out \\ 
    \hline 
1 & 1 & 0 & 2 & 1 
ewline (0 to 2) \\ 
2 & 2 & 1 & 3 & 2 
ewline (1 to 3) \\ 
3 & 3 & 2 & 4 & 3 
ewline (2 to 4) \\ 
    \hline 
\end{tabular} 
\end{table} 

Нет радости, так как \n теперь рассматривается как LineBreak когда анализируется через xtable.

This thread предложил использовать identity в качестве аргумента функции к sanitise.text.function, но это не сработало (и не использует функцию идентичности function(x){x}). Я нашел post on R-help с запросом аналогичных (но проблема была в том, что \t интерпретировалась как вкладка), но это тоже не сработало (снова вывод опущен для краткости).

my.data 
    V1 V2 V3     out 
1 1 0 2 1 \\newline (0 to 2) 
2 2 1 3 2 \\newline (1 to 3) 
3 3 2 4 3 \\newline (2 to 4) 
xtable(my.data, sanitise.text.function = identity) 
% latex table generated in R 3.2.0 by xtable 1.7-4 package 
% Wed Jun 24 13:09:47 2015 
\begin{table}[ht] 
\centering 
\begin{tabular}{rllll} 
    \hline 
& V1 & V2 & V3 & out \\ 
    \hline 
1 & 1 & 0 & 2 & 1 $\backslash$newline (0 to 2) \\ 
2 & 2 & 1 & 3 & 2 $\backslash$newline (1 to 3) \\ 
3 & 3 & 2 & 4 & 3 $\backslash$newline (2 to 4) \\ 
\hline 
\end{tabular} 
\end{table} 

my.data 
    V1 V2 V3     out 
1 1 0 2 1 \newline (0 to 2) 
2 2 1 3 2 \newline (1 to 3) 
3 3 2 4 3 \newline (2 to 4) 
xtable(my.data, 
     sanitise.text.function = identity) 
% latex table generated in R 3.2.0 by xtable 1.7-4 package 
% Wed Jun 24 13:28:28 2015 
\begin{table}[ht] 
\centering 
\begin{tabular}{rllll} 
    \hline 
& V1 & V2 & V3 & out \\ 
    \hline 
1 & 1 & 0 & 2 & 1 
ewline (0 to 2) \\ 
    2 & 2 & 1 & 3 & 2 
ewline (1 to 3) \\ 
    3 & 3 & 2 & 4 & 3 
ewline (2 to 4) \\ 
    \hline 
\end{tabular} 
\end{table} 

Такое ощущение, что я рядом с использованием sanitise.text.function варианта, но я не могу работать его. Есть ли способ сделать это как-то?

Заранее благодарим за любые предложения/идеи.

ответ

2

Ты сконфигурировал sanitize.*.function, используя options(), а не print()? Например,

options(xtable.sanitize.text.function=identity) 

предотвращает превращение \ с $\backslash$ в клетках.

+0

Спасибо за предложение, я на прошлой неделе заканчиваю эту работу в течение крайнего срока, и я слишком занят, чтобы проверить, но дам это когда-то, как только будут выполнены работы, и я убираю вещи. – slackline