Экспорт save_kable в формате PDF в Shiny - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь экспортировать таблицу kable (латекс) в файл .pdf с помощью R Shiny.

Вот код, который я использую для создания таблицы kable латекса:

x<-kable(overall, align = c('l', 'c', 'c', 'c', 'c', 'c', 'c'), "latex", booktabs = T,
             caption = "Sample Table",  
             escape = FALSE)%>%
      kable_styling(latex_options = c("striped")) %>%
      add_header_above(c(" " = 1, 'Group 1' = 3, 'Group 2' = 3))%>%
      landscape()

save_kable(x, 'SampleTable.pdf')

Я могу экспортировать это в отдельную R-программу, но я бы хотел повторить экспорт с R Shiny. Я попытался обернуть код в функцию downloadHandler, но он не работает.

Пример кода:

output$export = downloadHandler(
    filename = function() {"sampleTable.pdf"},
    content = function(file) {
     x<-kable(overall, align = c('l', 'c', 'c', 'c', 'c', 'c', 'c'), "latex", booktabs = T,
         caption = "Sample Table",  
         escape = FALSE)%>%
  kable_styling(latex_options = c("striped")) %>%
  add_header_above(c(" " = 1, 'Group 1' = 3, 'Group 2' = 3))%>%
  landscape()

  save_kable(x, file)
    }
  )

Любое понимание будет оценено.

1 Ответ

1 голос
/ 28 марта 2020

Это работает для меня (после установки pandoc и texlive-xetex):


library(shiny)
library(knitr)
library(kableExtra)

library(datasets)
options(knitr.table.format = "latex") # not required in newer versions of kableExtra

server <- function(input, output) {

    # Fill in the spot we created for a plot
    output$phonePlot <- renderPlot({

        # Render a barplot
        barplot(WorldPhones[,input$region]*1000, 
                main=input$region,
                ylab="Number of Telephones",
                xlab="Year")
    })
    output$export = downloadHandler(
        filename = function() {"sampleTable.pdf"},
        content = function(file) {
            x <- kable(WorldPhones, align = c('l', 'c', 'c', 'c', 'c', 'c', 'c'), "latex", booktabs = T,
                     caption = "Sample Table",  
                     escape = FALSE) %>%
                kable_styling(latex_options = c("striped")) %>%
                add_header_above(c(" " = 1, 'Group 1' = 3, 'Group 2' = 3)) %>%
                landscape()

            save_kable(x, file)
        },
        contentType = 'application/pdf'
    )

}

ui <- fluidPage(    

    # Give the page a title
    titlePanel("Telephones by region"),

    # Generate a row with a sidebar
    sidebarLayout(      

        # Define the sidebar with one input
        sidebarPanel(
            selectInput("region", "Region:", 
                        choices=colnames(WorldPhones)),
            hr(),
            helpText("Data from AT&T (1961) The World's Telephones."), 
            shiny::downloadButton("export", "Export")
        ),

        # Create a spot for the barplot
        mainPanel(
            plotOutput("phonePlot")  
        )

    )
)

shinyApp(ui = ui, server = server)

...