Используйте несколько реактивных наборов данных для записи в книгу Excel в разделе downloadHandler блестящий - PullRequest
0 голосов
/ 14 апреля 2020

Добрый день, заранее спасибо, что нашли время прочитать мой вопрос. В моем приложении Shiny я пытаюсь создать список реактивных объектов для записи в единую книгу Excel для загрузки пользователем. Я смог использовать части ответов из других постов, чтобы повторить мою проблему, и я довольно близко подошел к решению. Однако, хотя приведенный ниже пример использует список фреймов данных, таких как mtcars, iris и т. Д. c, я пытаюсь использовать реактивные наборы данных, такие как datasetInput1 (), datasetInput2 () и др. c.

shinyApp(
    ui = fluidPage(
        downloadButton("downloadExcelSheet", "Download Excel Workbook with Multiple Sheets")
    ),
    server = function(input, output) { 

        #### Write an Excel workbook with one sheet per dataframe ####
        output$downloadExcelSheet <- downloadHandler(
            filename = function() {
                "excelWorkbook.xlsx"
            },
            content = function(file) {
                # write workbook and first sheet
                write.xlsx(mtcars, file, sheetName = "mtcars", append = FALSE)

                # add other sheets for each dataframe
                listOtherFiles <- list(iris = iris, 
                                       airquality = airquality, 
                                       sleep = sleep)
                for(i in 1:length(listOtherFiles)) {
                    write.xlsx(listOtherFiles[i], file, 
                               sheetName = names(listOtherFiles)[i], append = TRUE)
                }
            }
        )

Когда я пытаюсь использовать эти реактивные объекты в приведенном ниже примере, я могу успешно загрузить данные, когда в списке только один набор данных. Например, ниже работает, но как только я начинаю добавлять больше в список listOtherFiles, например listOtherFiles <- list (datasetInput2 (), datasetInput3 ()), я получаю сообщение об ошибке. </p>

shinyApp(
    ui = fluidPage(
        downloadButton("downloadExcelSheet", "Download Excel Workbook with Multiple Sheets")
    ),
    server = function(input, output) { 

datasetInput1 <- reactive({

    data %>% 
      filter(sub_date == input$date, app_type == input$type)
})


datasetInput2 <- reactive({

    data2 %>% 
      filter(sub_date == input$date, app_type == input$type)
})

        output$downloadExcelSheet <- downloadHandler(
            filename = function() {
                "datasetOutput.xlsx"
            },
            content = function(file) {
                # write workbook and first sheet
                write.xlsx(datasetInput1(), file, sheetName = "dataset1", append = FALSE)

                # add other sheets for each dataframe
                listOtherFiles <- list(datasetInput2())

                for(i in 1:length(listOtherFiles)) {
                    write.xlsx(listOtherFiles[i], file, 
                               sheetName = names(listOtherFiles)[i], append = TRUE)
                }
            }
        )

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Я не уверен, что могу воспроизвести проблему. Вот мой пример ниже. Кажется, это работает и использует два reactive выражения. Это работает для вас?

Если нет, пожалуйста, отредактируйте ваш вопрос и опишите дальше. Возможно, включить пример данных и ui с входами для воспроизведения. В чем была ваша ошибка?

library(xlsx)
library(shiny)
library(tidyverse)

shinyApp(
  ui = fluidPage(
    downloadButton("downloadExcelSheet", "Download Excel Workbook with Multiple Sheets")
  ),
  server = function(input, output) { 

    datasetInput1 <- reactive({
      iris %>% 
        filter(Species == "setosa")
    })

    datasetInput2 <- reactive({
      iris %>% 
        filter(Species == "versicolor")
    })

    #### Write an Excel workbook with one sheet per dataframe ####
    output$downloadExcelSheet <- downloadHandler(
      filename = function() {
        "excelWorkbook.xlsx"
      },
      content = function(file) {
        # write workbook and first sheet
        write.xlsx(mtcars, file, sheetName = "mtcars", append = FALSE)

        # add other sheets for each dataframe
        listOtherFiles <- list(setosa = datasetInput1(), versicolor = datasetInput2())
        for(i in 1:length(listOtherFiles)) {
          write.xlsx(listOtherFiles[[i]], file, 
                     sheetName = names(listOtherFiles)[i], append = TRUE)
        }
      }
    )
  }
)
0 голосов
/ 14 апреля 2020

datasetInput1 () - реактивное значение, не определенное в логах сервера c. Для этого нужно сначала присвоить значение или создать функцию для обновления значений.

Ниже приведены некоторые полезные статьи для понимания реактивных элементов блестящей системы:

https://shiny.rstudio.com/articles/understanding-reactivity.html

https://shiny.rstudio.com/articles/reactivity-overview.html

...