在 Shiny 中无错误地下载反应对象

Error-free download of reactive objects in Shiny

闪亮专家!

在我们的应用程序中,我们有下载情节的下载按钮。该按钮仅在加载和处理某些数据时起作用。当您之前按下按钮时,绘图功能会出现错误消息,因为它没有数据。

content = function(file) {
            r <- rChart_line_plot(follow_view_func(),log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
            r$save(file, standalone = TRUE)
        }

我们想让我们的应用程序万无一失,没有错误。有什么方法可以发送到 downloadHandler 的内容 "NULL"?这行不通。

content = function(file) {
          if ( "our data are ready for printing" ) {
            r <- rChart_line_plot(follow_view_func(),log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
            r$save(file, standalone = TRUE)
          } else {
            NULL
          }
        }

我们得到:

Error opening file: 2
Error reading: 9

是否有类似 validate() 函数的东西,甚至可以为用户 "Please load file first"

非常感谢。

您想要 validate 声明是正确的。这是一个 link,其中包含 RStudio 团队的描述。这将使您获得信息更丰富的错误消息。您的完整 downloadHandler 函数将如下所示。请注意,这假设您的数据集可能为空。

output$Download <- downloadHandler(
                filename = function() {
                    paste("test.png",sep="")
                },
                content = function(file) {
                    myData <- follow_view_func()
                    validate(
                        need(!is.null(myData), "Please select valid dataset")
                    )
                    r <- rChart_line_plot(myData,log_scale = input$checkbox_log_scale_plot,isRel = input$checkboxRelativeTab2)
                    r$save(file, standalone = TRUE)
                }
            )

这里是 iris 数据集的完整可重现示例。

library(shiny)
library(rCharts)
runApp(
    list(
        ui = pageWithSidebar(
            headerPanel("Using 'validate' for useful error messages"),

            sidebarPanel(
                selectInput("dataset", "Choose a dataset:", 
                            choices = c("null", "iris")),
                selectInput(inputId = "x",
                            label = "Choose X",
                            choices = c('SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'),
                            selected = "SepalLength"),
                selectInput(inputId = "y",
                            label = "Choose Y",
                            choices = c('SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'),
                            selected = "SepalWidth"),
                downloadButton("Download")
            ),
            mainPanel(
                showOutput("myChart", "polycharts")
            )
        ),

        server = function(input, output) { 

            datasetInput <- reactive({
                switch(input$dataset,
                       "iris" = iris,
                       "null" = NULL)
            })

            myChart <- reactive({
                myData <- datasetInput()
                validate(
                    need(!is.null(myData), "Please select valid dataset")
                )
                names(myData) = gsub("\.", "", names(myData))
                p1 <- rPlot(input$x, input$y, data = myData, color = "Species", 
                            facet = "Species", type = 'point')
                p1$addParams(dom = 'myChart')
                return(p1)
            })

            output$myChart <- renderChart({myChart()})

            output$Download <- downloadHandler(
                filename = function() {
                    paste("test.png",sep="")
                },
                content = function(file) {
                    p1 <- myChart()
                    p1$save(file, standalone = TRUE)
                }
            )
        }
        )
    )

更新

根据 OP 的要求,下载按钮最好没有任何错误。我能想到的唯一解决方案是将按钮设为 conditionalPanel。这在直觉上对我来说很有意义,因为如果屏幕上什么都没有,你为什么要下载?上面代码中唯一需要更改的是更改:

downloadButton("Download")

conditionalPanel("output.myChart", downloadButton("Download"))

现在只有在创建有效图表时才会显示下载按钮。