2015-11-04 3 views
0

Мне нужно поместить текстовую панель в мое блестящее приложение, которое исчезает через 10 секунд после его запуска (как совет), кто-нибудь знает, возможно ли это? Я попытался использовать команду «invalidLater», но она всегда появляется снова.Добавить панель в блестящей, которая исчезает вовремя

Благодаря

Louro, J.

+0

Посмотрите на пакет 'shinyBS' здесь https://ebailey78.github.io/shinyBS/docs/Modals.html#bsModal –

+0

вы можете поместить что-то вроде' invalidateLater (1e4, session); if ((active << - exists ('active'))) return() 'в начале' renderUI', а 'uiOutput' будет отображаться в течение 10 секунд. – jenesaisquoi

ответ

1

Как @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.

+0

красиво сделано. Я действительно удивляюсь, если это лучший способ? Я пытался экспериментировать с 'withReactiveDomain', пытаясь что-то вроде' invalidateLater' полностью исчезнуть, если это имеет смысл. Это беспокоит меня, потому что он недействителен неопределенно. Я не мог понять, как заставить его работать, хотя ... – jenesaisquoi

+0

Спасибо! это отличный вопрос (и да, недействительность не так уж и велика), я должен думать об этом –

+0

Я пытаюсь сформулировать вопрос и, надеюсь, опубликовать его позже сегодня, начиная с чтения документов, кажется, что это должно быть возможно создать фиктивную реактивную среду, создать в ней некоторые реактивные элементы, а затем уничтожить их и окружающую среду. Но пока приложение просто падает, когда я пытаюсь это сделать. – jenesaisquoi

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