2014-11-26 2 views
10

Я новичок в 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()) 
    }) 


    } 
) 

Заранее спасибо за помощь.

ответ

2

Я думаю, 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) 
+0

Спасибо (еще раз) за помощью @Mikael. Я уезжаю на отдых в течение следующих 4 дней, но я попробую это в понедельник и напишу о том, как это происходит. –

+0

Привет @Mikael. Кажется, это все еще содержит весь вывод queryMagic(), пока не завершится запросMagic. После того, как queryMagic закончит весь печатный вывод, он появится в пользовательском интерфейсе. 'queryMagic <- функция() { печать ("предупреждение1") Sys.sleep (3) печать ("предупреждение2") Sys.sleep (3) печать ("Warning3") возвращение ("Data") } ' –

+0

Мои непосредственные потребности решены с помощью блестящего индикатора выполнения, но основной вопрос остается без ответа –

Смежные вопросы