Как @bunk показывает хороший способ заключается в использовании invalidateLater, вот несколько примеров:
library(shinyjs)
ui <- shinyUI(
fluidPage(
tags$head(
tags$script(
HTML(
'
Shiny.addCustomMessageHandler("registerTimer", function(message){
console.log("Timer registered for $("+message.selector+")with delay "+message.delay);
setTimeout(removeElementFromDOM, message.delay, message.selector);
});
function removeElementFromDOM(selector){
$("#"+selector).remove();
}
'
)
)
),
uiOutput("ui1"),
textOutput("ui2"),
plotOutput("plt1"),
div(id="txtDiv","Some text here")
)
)
rm(active)
server <- shinyServer(function(input,output, session){
data <- data.frame("x"=runif(10),"y"=runif(10))
txt1 <- "Some text"
makeReactiveBinding('txt1')
makeReactiveBinding('data')
# Remove with javascript
session$sendCustomMessage('registerTimer',
message=list(selector='txtDiv',delay=4000))
# Hide with shinyjs
output$plt1 <- renderPlot({
if (is.null(data)){
hide("plt1")
} else{
plot(x~y,data)
}
})
output$ui2 <- renderText({
txt1
})
# Continously update, output nothing after time
output$ui1 <- renderUI({
invalidateLater(1000, session);
if ((active <<- exists('active'))) return()
div("Text here")
})
# Triggers change
reactiveTimer(2000,{
txt1 <- NULL
})
reactiveTimer(3000,{
data <- NULL
})
})
shinyApp(ui=ui,server=server)
ui1
использует метод invalidateLater, ui2
использует реактивное значение, которое установлено в NULL, а plt1
- это вариация ui2, где shinyjs используется для скрытия plotOutput.
Edited
Я добавил решение Javascript для этого вы можете использовать его на любом элементе DOM.
Посмотрите на пакет 'shinyBS' здесь https://ebailey78.github.io/shinyBS/docs/Modals.html#bsModal –
вы можете поместить что-то вроде' invalidateLater (1e4, session); if ((active << - exists ('active'))) return() 'в начале' renderUI', а 'uiOutput' будет отображаться в течение 10 секунд. – jenesaisquoi