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
Я думаю, что 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)