在downloadHandler中进行验证-避免生成文件

时间:2019-03-07 16:19:03

标签: r shiny

背景

我有一个reactive,它既用于渲染输出,又用于downloadHandler。在此reactive中,如果有问题,我使用validaterender*函数发出信号。但是,这在downloadHandler中造成了问题。在下面的应用中,如果输入未通过验证,浏览器将显示“ HTTP 500内部服务器错误”(IE)或“失败-服务器问题”(Chrome)-参见。屏幕截图。

Chrome Server Failed

IE HTTP 500

所需结果

我想首先找到一种避免这种行为的方法。我已阅读Validate inside downloadHandlerShiny: use validate() inside downloadHandler,并且两者都建议在出现问题时隐藏/更改下载按钮。那么observer无效时将触发的reactive会是什么样子?

注意。由于reactive本身封装在模块中,并且该模块无法访问我的{ {1}}。

代码

downloadHandler

2 个答案:

答案 0 :(得分:1)

您可以使用show软件包中的hideshinyjs函数-

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  numericInput("n", "n", 0, -3, 3), 
  downloadLink('downloadData', 'Download')
)

server <- function(input, output, session) {
  r <- reactive({
    validate(need(input$n >= 0, "value is smaller than zero"))
    as.character(input$n)
  })

  output$downloadData <- downloadHandler(
    filename = function() {
      paste('data-', Sys.Date(), '.txt', sep='')
    },
    content = function(con) {
      writeLines(isolate(r()), con)
    }
  )

  observe({
    ## if i could react whenever r() is invalid
    ## I could simply hide the download button here
    ## tryCatch(r(), ...) did not work
    if(input$n < 0) {
      hide(id = "downloadData")
    } else {
      show(id = "downloadData")
    }
  })
}

shinyApp(ui, server)

答案 1 :(得分:1)

我找到了解决方案。尽管tryCatch不能按预期工作,但我发现了try的解决方案:

observe({
  res <- try(handler$reactive_i_cannot_change_because_the_code_does_not_belong_2_me(), TRUE)
  if ("try-error" %in% class(res)) {
    print("disable")
  }
})