Рендеринг реактивных таблиц Stargazer в формате LaTeX - PullRequest
1 голос
/ 21 апреля 2020

Я хотел бы отобразить {stargazer} таблицы в формате LaTeX в приложении Shiny, поскольку некоторые параметры касаются только LaTeX (например, table.placement). Я видел этот ответ , который использует withMathJax, но следующий пример не работает для меня, у меня просто есть какой-то код LaTeX в "коробке":

library(shiny)
library(stargazer)

ui <- fluidPage(
  uiOutput("test")
)

server <- function(input, output, session) {

  regression <- lm(mpg ~ drat + hp + disp, data =  mtcars)

  table_output <- reactive({
      stargazer(regression)
  })

  output$test <- renderUI({
    withMathJax(HTML(table_output()))
  })

}

shinyApp(ui, server)

Есть ли способ отображения реактивной таблицы Stargazer в формате LaTeX?

1 Ответ

1 голос
/ 22 апреля 2020

MathJax не поддерживает код LaTeX, сгенерированный stargazer.

Вот решение. Он компилирует код LaTeX с помощью tools::texi2pdf и использует библиотеку JavaScript PDFobject для встраивания PDF. Кроме того, он использует программу pdfinfo для получения соответствующих размеров (ширины и высоты) для средства просмотра PDF.

library(shiny)
library(stargazer)

js <- function(width, height){
  sprintf('
var options = {
  width: "%dpx",
  height: "%dpx",
  pdfOpenParams: { 
    view: "Fit", 
    scrollbar: "0", 
    toolbar: "0", 
    statusbar: "0", 
    messages: "0",
    navpanes: "0"
  }
};
PDFObject.embed("mypdf.pdf", "#pdf", options);
', width, height)
}

ui <- fluidPage(
  tags$head(
    tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/pdfobject/2.1.1/pdfobject.min.js")
  ),
  uiOutput("pdfcontainer")
)

server <- function(input, output){

  output[["pdfcontainer"]] <- renderUI({
    tmpDir <- tempdir()
    texfile <- file.path(tmpDir, "table.tex")
    pdffile <- file.path(tmpDir, "table.pdf")
    infofile <- file.path(tmpDir, "table.txt")
    regression <- lm(mpg ~ drat + hp + disp, data =  mtcars)
    LaTeX <- stargazer(regression, float = FALSE)
    writeLines(
      c(
        "\\documentclass[12pt, border={20pt 20pt 20pt 20pt}]{standalone}",
        "\\begin{document}",
        LaTeX,
        "\\end{document}"
      ),
      texfile
    )
    file.remove("www/mypdf.pdf")
    owd <- setwd(tmpDir)
    tools::texi2pdf(texfile, clean = TRUE)
    setwd(owd)
    file.copy(pdffile, "www/mypdf.pdf", overwrite = TRUE)
    command <- sprintf("pdfinfo -box www/mypdf.pdf > %s", infofile)
    system(command)
    info <- readLines(infofile)
    pageSize <- info[grep("Page size:", info)]
    dimensions <- as.numeric(
      unlist(
        regmatches(pageSize, gregexpr("[[:digit:]]+\\.*[[:digit:]]*", pageSize))
      )
    )
    width <- max(300, floor(dimensions[1]))
    height <- floor(width*dimensions[2]/dimensions[1])
    tagList(
      tags$div(id = "pdf"),
      tags$script(HTML(js(width, height)))
    )
  })

}

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...