Brilhante: imprime a saída do console para um objeto de texto sem esperar a conclusão de uma função
Eu sou novo no Shiny e estou lutando consideravelmente.
Eu preciso dar aos meus usuários do Shiny a capacidade de baixar um arquivo de dados (essencialmente consultando um banco de dados). A consulta vai de uma vez para outra. O Shiny suporta datas de forma nativa, mas não há tempo, por isso tenho que fornecer aos usuários um campo de texto com umsubmitButton
O problema é que preciso que o botão enviar faça um teste de validação nas duas entradas de texto e: 1) Retorne uma mensagem de erro se uma entrada não for válida 2) Faça o download dos dados, enquanto atualiza o status (os dados podem demorar um pouco). hora com facilidade - não quero deixar os usuários em espera).
Eu descobri algo chamadorenderPrint
essa parecia ser uma boa opção, pois pretende produzir o que foi impresso no console - então eu posso imprimir uma mensagem de erro ou exibir a saída normal do console a partir do processo de download de dados. Porém, ele retém a saída impressa até que todo o processo esteja concluído.
Estou pensando que outra solução possível seria voltar para renderText e renderizar texto diretamente doqueryMagic
função - ao passar pelo processo de download de dados, ele pode atualizar periodicamenteoutput$text
com novo texto. Mas não sei exatamente como fazer isso.
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())
})
}
)
Agradecemos antecipadamente a ajuda.