Блестящий renderTable add.to.row

У меня есть фреймворк, который может выглядеть так

> df
Product    noPat     Val  Tot TotVal
Product A  -318 -108.12 1356 461.04
Product C   403  544.05  462  623.7
Product D   -32  -39.68  529 655.96
Product B   N/A     N/A  N/A    N/A

Я хотел бы добавить две многоколонки, используя аргумент add.to.row в функции xtable.

print(xtable(df, digits=2, caption=strCaption, label="Test_table"), 
      size="footnotesize", #Change size; useful for bigger tables
      include.rownames=FALSE, #Don't print rownames
      caption.placement="top", 
      hline.after=NULL, #We don't need hline; we use booktabs
      add.to.row = list(pos = list(-1, 
                                   nrow(df)),
                        command = c(paste("\\hline \n",
                                          "& \\multicolumn{2}{c}{Growth} & \\multicolumn{2}{c}{Total} \\\\ \n",
                                          "\\hline \n"),
                                    "\\hline \n")
      )
)

Что генерирует желаемый результат латекса:

\begin{table}[ht]
\centering
\caption{test} 
\label{Test_table}
\begingroup\footnotesize
\begin{tabular}{lllll}
  \hline 
 & \multicolumn{2}{c}{Growth} & \multicolumn{2}{c}{Total} \\ 
 \hline 
Product & noPat & Val & Tot & TotVal \\ 
 Product A & -318 & -108.12 & 1356 & 461.04 \\ 
  Product C & 403 & 544.05 & 462 & 623.7 \\ 
  Product D & -32 & -39.68 & 529 & 655.96 \\ 
  Product B & N/A & N/A & N/A & N/A \\ 
   \hline 
\end{tabular}
\endgroup
\end{table}

Какой формат мне нужен. Я хотел бы, чтобы Shiny выводил это, но Shiny просто добавляет аргумент add.to.row в виде текста, выводимого непосредственно над таблицей.

Моя реализация в Shiny:

Server.R

output$tabletest <- renderTable({
        rows <<- nrow(df)
        xtable(df, digits=2)

      },

      caption = "Sample Data",
      caption.placement = getOption("xtable.caption.placement", "bottom"), 
      caption.width = getOption("xtable.caption.width", NULL),
      include.rownames=getOption("xtable.include.rownames", FALSE), #Don't print rownames
      add.to.row = getOption("xtable.add.to.row",list(pos = list(-1, 
                                   rows),
                        command = c(paste("\\hline \n",
                                          "& \\multicolumn{2}{c}{Growth} & \\multicolumn{2}{c}{Total} \\\\ \n",
                                          "\\hline \n"),
                                    "\\hline \n")))
      )

UI.R

tableOutput("tabletest")

Использование MathJax

Как было предложено NicE, я попытался использовать MathJax следующим образом

Server.R

output$tabletest<- renderUI({
        result <- withMathJax(HTML(
        "\\begin{table}[ht]
        \\centering
        \\caption{test}
        \\label{Test_table}
        \\begin{tabular}{lllll}
        \\hline
        & \\multicolumn{2}{c}{Growth} & \\multicolumn{2}{c}{Total} \\\\
        \\hline
        Product & noPat & Val & Tot & TotVal \\\\
        Product A & -318 & -108.12 & 1356 & 461.04 \\\\
        Product C & 403 & 544.05 & 462 & 623.7 \\\\
        Product D & -32 & -39.68 & 529 & 655.96 \\\\
        Product B & x & x & x & x \\\\
        \\hline
        \\end{tabular}
        \\end{table}"
        ))
 })

UI.R

              withMathJax(),
              uiOutput("KeyIndicatorsPatients")

Но это приводит к

Вывод MathJax


person marcopah    schedule 29.02.2016    source источник
comment
renderTable будет использовать type="html" для печати xtable, но ваш add.to.row - латекс, поэтому они не печатаются, вы можете использовать withMathJax для отображения таблицы, вот пример   -  person NicE    schedule 29.02.2016
comment
@NicE спасибо за ваш комментарий. Я пробовал реализовать это, но не получается. Пожалуйста, взгляните на мою правку, если у вас есть время.   -  person marcopah    schedule 29.02.2016
comment
вам нужно добавить следующие аргументы: floating=FALSE, tabular.environment="array", comment=FALSE, print.results=FALSE, а также добавить $$ в начале и в конце кода (это делается с помощью вставки в ссылку, которую я опубликовал). Оказывается, MathJax не поддерживает \multicolumn, поэтому я предполагаю, что единственный вариант - преобразовать дополнительную строку в html. Я выложил пример.   -  person NicE    schedule 01.03.2016


Ответы (1)


renderTable будет использовать type="html" для печати xtable, но ваш add.to.row латексный, поэтому они не печатаются.

Вы можете попробовать преобразовать свой код в HTML, например:

output$tabletest <- renderTable({
    xtable(df,digits=2)
  },
  size="footnotesize", #Change size; useful for bigger tables
  include.rownames=FALSE, #Don't print rownames
  caption.placement="top",
  include.colnames=FALSE,
  add.to.row = list(pos = list(0),
                    command = "<tr><th></th><th colspan='2'>Growth</td><th colspan='2'>Total</th></tr>
<tr> <th> Product </th> <th> noPat </th> <th> Val </th> <th> Tot </th> <th> TotVal </th>  </tr>"
  ))

Я добавил include.colnames=FALSE к вашим аргументам и добавил их вручную в add.to.row, чтобы поместить их под другим заголовком.

Результат выглядит так:

пример таблицы

person NicE    schedule 01.03.2016
comment
Большое спасибо. Я попробую завтра и вернусь к вам. - person marcopah; 01.03.2016
comment
Работает так, как хотелось бы. Спасибо! - person marcopah; 02.03.2016