Я думаю, что там есть немного ненужного кода. Ваше определение startTime
и endTime
как в пределах server
, так и в отдельных реактивных чанах сбивает с толку (и вас, и читателей); скорее всего, оба местоположения не требуются, и, поскольку я предпочитаю использовать system.time
, я предлагаю, чтобы ни одно из этих мест не было необходимым.
Есть два способа получить два возвращаемых значения (данные и истекшее время) из чанка: (1) вернуть list
и (2) reactiveValues()
.
Сохранение ваших ui
и shinyApp
...
Для первого варианта (list
) компонент server
становится:
server <- function(input, output) {
mydat <- eventReactive(input$userText, {
req(input$userText)
tm <- system.time({
Sys.sleep(runif(1))
out <- paste("This is the user input text:", sQuote(input$userText))
})
list(x=out, elapsed=tm['elapsed'])
})
# Display pasted text
output$textInput <- renderText({
req(mydat())
mydat()$x
})
# Display execution time
output$timer <- renderText({
req(mydat())
paste0("Executed in: ", round(mydat()$elapsed*1000), " milliseconds")
})
}
Для второго варианта попробуйте:
server <- function(input, output) {
times <- reactiveVal()
mydat <- reactiveVal()
# operates in side-effect
observeEvent(input$userText, {
req(input$userText)
tm <- system.time({
Sys.sleep(runif(1))
out <- paste("This is the user input text:", sQuote(input$userText))
})
times(tm['elapsed'])
mydat(out)
})
# Display pasted text
output$textInput <- renderText({
req(mydat())
mydat()
})
# Display execution time
output$timer <- renderText({
req(times())
paste0("Executed in: ", round(times()*1000), " milliseconds")
})
}
(Вместо двух reactiveVal()
переменных вы также можете использовать предложение @ divibisan для использования reactiveValues()
, того же конечного результата.)