Перезапустить блестящую сессию

Это кажется очевидным вопросом, но я не нашел ничего по этому поводу.

Как я могу обновить блестящее приложение (эквивалент нажатия F5 или нажатия кнопки «Перезагрузить приложение» в RStudio)?

ui.R

 shinyUI(pageWithSidebar(
  headerPanel("Example"),
  sidebarPanel(
    actionButton("goButton", "Refresh")
  ),  
  mainPanel(
        h4("I would really like to refresh this please.")
    )   
))

server.R

shinyServer(function(input, output,session) { 
  observe({
    if(input$goButton==0) return(NULL)
    isolate({
      #
      #  I would like to refresh my session here with some sort of 
      #  function like session(refresh)...
    })
    })
})

Я не думаю, что хочу использовать stopApp () - я просто хочу обновить его, чтобы он находился в том же состоянии, что и при загрузке.

ОБНОВЛЕНИЕ

На веб-сайте RStudio показано, здесь, как для управления сеансом пользователя с сервера. Конкретно,

$ sudo rstudio-server suspend-session <pid>

Есть ли в приложении эквивалентная функция для пользователя? В документации для информации о сеансе (здесь) говорится, что есть onSessionEnded (обратный вызов) функция. Было бы хорошо, если бы существовала функция session.End (), которая выполняет указанную выше функцию приостановки сеанса!


person Hamilton Blake    schedule 31.07.2014    source источник


Ответы (3)


Вы можете использовать history.go(0) js-метод для перезагрузки страницы и, таким образом, сброса сеанса, например по ссылке:

p(HTML("<A HREF=\"javascript:history.go(0)\">Reset this page</A>"))

Кроме того, вы можете использовать shinyjs package для выполнения javascript на сервере:

library(shiny)
library(shinyjs)

jsResetCode <- "shinyjs.reset = function() {history.go(0)}" # Define the js method that resets the page

shinyApp(
  ui = fluidPage(
    useShinyjs(),                                           # Include shinyjs in the UI
    extendShinyjs(text = jsResetCode, functions = "reset"), # Add the js code to the page
    actionButton("reset_button", "Reset Page")
  ),

  server = function(input, output) {
    observeEvent(input$reset_button, {js$reset()})          # Call the method from
                                                            # somewhere within the server
  })
person bubble    schedule 02.12.2015
comment
Хороший ответ @bubble. Как автор shinyjs, я также хотел бы добавить, что если сброса всех входов достаточно (т. Е. Вернуть все входные значения обратно в их исходное состояние, а не буквально обновлять страницу), то вы можете использовать встроенный в функции сброса shinyjs - person DeanAttali; 05.12.2015
comment
Спасибо за отзыв @daattali :) Это был мой первый ответ. - person bubble; 07.12.2015
comment
Хороший ответ, извините за задержку. - person Hamilton Blake; 19.05.2016

Теперь у сеанса есть способ сделать трюк. Shinyjs больше не требуется:

session$reload()
person Jan    schedule 23.05.2020

Вы можете добавить в приложение значок обновления и всплывающее окно, включив в код пользовательского интерфейса следующее:

library(shinyBS)

tags$a(href="javascript:history.go(0)", 
           popify(tags$i(class="fa fa-refresh fa-5x"),
                  title = "Reload", 
                  content = "Click here to restart the Shiny session",
                  placement = "right"))

Он должен дать вам следующее:

введите описание изображения здесь

person SANBI samples    schedule 23.05.2017