闪亮:打印控制台输出到文本对象而无需等待功能完成

时间:2014-11-26 00:29:38

标签: r shiny

我是Shiny的新手并且相当挣扎。

我需要让我的Shiny用户能够下载数据文件(基本上是查询数据库)。查询从一次到另一次。 Shiny本地支持日期,但不支持时间,因此我必须为用户提供带有submitButton

的文本字段

问题是我需要让提交按钮对两个文本输入执行验证测试,并且: 1)如果任一输入无效,则返回错误消息 2)下载数据,同时提供状态更新(数据可能需要一个小时轻松 - 我不想让用户挂起)。

我发现了一个名为renderPrint的东西似乎是一个不错的选择,因为它声称输出打印到控制台的东西 - 然后我可以打印错误信息或显示数据的正常控制台输出下载过程。但是它保持打印输出直到整个过程完成。

我认为另一种可能的解决方案是返回renderText然后直接从queryMagic函数呈现文本 - 当它经历数据下载过程时,它可以定期更新output$text用新文本。但我不确定如何做到这一点。

ui.R:

shinyUI(fluidPage(

  # Application title
  titlePanel("Demo Market Report"),

  fluidRow(

    column(4,
           h3("Extract Data"),
           helpText("Enter a start and end date/time of data to download. Be aware it takes about 10 minutes to download one hour of data.", strong("Date/time should be entered in yyyy-mm-dd hh:mm:ss format.")),
           textInput("fromDatetime", "From:", value = paste(with_tz(Sys.time(), "EST")-3600 )),
           textInput("toDatetime", "To:", value = paste(with_tz(Sys.time(), "EST"))),
           submitButton("Download Data Extract")
    ),
    column(4,
           textOutput("text1")
    )
  )


))

server.R:

shinyServer(
  function(input, output) {

    logText <- reactive({
      if (input$fromDatetime == "a") {
        data = queryMagic(blah,blah,blah) #this just gets the data, function is already used in production, I'll feed the shiny input into it but that seems straightforward
        return("victory")
      }
      else return("invalid")
    })

    output$text1 <- renderPrint({
      paste(logText())
    })


  }
)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我认为capture.output是从控制台捕获文本的好方法。

 server <- function(input, output) {
  values <- reactiveValues()

  queryMagic <- function() {
    print("Warning")

    return("Data")
  }
  output$console <- renderPrint({
    logText()
    return(print(values[["log"]]))
    # You could also use grep("Warning", values[["log"]]) to get warning messages and use shinyBS package
    # to create alert message
  })

  logText <- reactive({
    values[["log"]] <- capture.output(data <- queryMagic())


  })
}

ui <- shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
    ),
    mainPanel(verbatimTextOutput("console"))
  )
))

shinyApp(ui = ui, server = server)