web-dev-qa-db-ja.com

光沢:関数の終了を待たずにコンソール出力をテキストオブジェクトに印刷する

私はシャイニーに不慣れで、かなり苦労しています。

Shinyユーザーにデータファイルをダウンロードする機能を提供する必要があります(基本的にデータベースにクエリを実行します)。クエリはある時間から別の時間に移動します。 Shinyは日付をネイティブにサポートしますが、時間はサポートしないため、ユーザーにsubmitButtonを含むテキストフィールドを提供する必要があります。

問題は、送信ボタンに両方のテキスト入力で検証テストを実行させる必要があることです。1)どちらかの入力が無効な場合はエラーメッセージを返します。2)ステータスを更新しながらデータをダウンロードします(データは簡単に1時間-ユーザーをぶら下げたままにしたくない)。

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())
    })


  }
)

助けてくれてありがとう。

13
Michael Sherman

おもう 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)
3