Можно ли загрузить все блестящие приложения, включая реактивные значения и несколько таблиц и графиков, в файл PDF или изображение одним щелчком мыши? - PullRequest
1 голос
/ 02 октября 2019

Я уже давно пытаюсь найти решение этой проблемы. Я попробовал appshot, но мои таблицы и графики отображаются пустыми.

Любая помощь или рекомендации будут очень благодарны.

1 Ответ

3 голосов
/ 02 октября 2019

Вы можете использовать html2canvas библиотеку JavaScript для создания снимков экрана.

Для создания приглашения на загрузку я ссылался на этот пост: Как сохранить img на локальном компьютере пользователяиспользуя HTML2canvas

И, чтобы запустить произвольный JavaScript, вам нужно загрузить библиотеку shinyjs в R.

Пожалуйста, посмотрите пример приложения ниже:

library(shiny)
library(shinyjs)
library(DT)
library(ggplot2)

ui <- fluidPage(
    tags$head(
        # include html2canvas library
        tags$script(src = "http://html2canvas.hertzen.com/dist/html2canvas.min.js"),
        # script for creating the prompt for download
        tags$script(
            "
            function saveAs(uri, filename) {

                var link = document.createElement('a');

                if (typeof link.download === 'string') {

                    link.href = uri;
                    link.download = filename;

                    //Firefox requires the link to be in the body
                    document.body.appendChild(link);

                    //simulate click
                    link.click();

                    //remove the link when done
                    document.body.removeChild(link);

                } else {

                    window.open(uri);

                }
            }
            "
        )
    ),
    useShinyjs(),
    actionButton("screenshot","Take Screenshot"),
    dataTableOutput("table"),
    plotOutput("plot")


)

server <- function(input, output, session) {
    observeEvent(input$screenshot,{
        shinyjs::runjs(
            'html2canvas(document.querySelector("body")).then(canvas => {
                saveAs(canvas.toDataURL(), "shinyapp.png");
           });'
        )
    })


    output$table <- renderDataTable(iris)

    output$plot <- renderPlot(ggplot(data = iris) + 
                                  geom_point(aes(x = Sepal.Length, y = Sepal.Width)))
}

shinyApp(ui, server)
...