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

时间:2015-02-03 16:08:07

标签: r 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的内容&#34; NULL&#34;?这不起作用。

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()的函数,甚至包含用户信息&#34;请先加载文件&#34;

非常感谢你。

1 个答案:

答案 0 :(得分:4)

你想要一个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"))

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