Кнопка ShinyAction закрывает приложение, но пропускает сессию $ onSessionEnded - PullRequest
0 голосов
/ 10 июня 2018

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

Я хотел бы добавить ActionButton, чтобы закрыть блестящий окно вместо того, чтобы человеку приходилось закрывать окно

ActionButton закрывается блестящим --- но он обходит код в session$onSessionEnded

После запуска терминал Shiny показывает его отсканированное в значениях цветовой палитры, но глобальная переменная cherrypickedpalette равна NULL

> CherryPickPalette("BiryaniRice","Kulfi","Haveli2")

Listening on http://127.0.0.1:5345
Read 8 items
> cherrypickedpalette
NULL

Вот сценарий весь R

Функция вызова

CherryPickPalette <- function (name, name2=NULL, name3=NULL){

  #snipped code#

  cherrypickedpalette <- CustomPal(new_pal)

  #snipped code#

}

Функция с Shiny

CustomPal <- function(new_pal){
  if (interactive()){
    #snipped code#
    }
    cherrypickedpalette <- runApp(list(
      #snipped code#
        mainPanel(
          h5('Your Cherry-Picked Palette',style = "font-weight: bold;"),
          fluidRow(column(12,verbatimTextOutput("col"))),
          actionButton("action", label = "I'm Done")
          )
      ),
      server = function(input,output,session){
        outputdata<-  reactive({
          input$col
        })

        output$col <- { 
          renderPrint(outputdata())
        }

        #Code to detect closing button
        observe({
          if (input$action > 0) 
            stopApp()
        })
        #Code to detect closing button

        session$onSessionEnded(function(){
          message <- paste(isolate(outputdata())," ")
          cat(message,file=colorfile, append=TRUE)
          cherrypickedpalette <<- scan(file=colorfile," ")
          stopApp(cherrypickedpalette)
          file.remove(colorfile)
        })
      }
    )
    )
  }
}

1 Ответ

0 голосов
/ 10 июня 2018

Используя код GitHub, я теперь могу воспроизвести ваше приложение.Кажется, что onSessionEnded вызывается, так как файл записывается на диск, а также вызывается cat.Так что я не думаю, что проблема есть.Каким-то образом cherrypickedpalette <<- не присваивается глобальной среде.

Но я не понимаю, зачем записывать результаты на диск, а затем сканировать их снова, чтобы получить значения?Это по определенной причине?

Я смог присвоить цвета глобальной среде, используя assign в функции onSessionEnded.

Попробуйте вместо этого использовать эту функцию CustomPal:

CustomPal <- function(new_pal){
  if (interactive()){
    cherrypickedpalette <- runApp(list(
      ui = {fluidPage(
        titlePanel("Cherry Pick Your Own Palette!"),
        sidebarPanel (hr(),
                      selectInput('col', 'Options', new_pal, multiple=TRUE, selectize=FALSE, size = 15)
        ),
        mainPanel(
          h5('Your Cherry-Picked Palette',style = "font-weight: bold;"),
          fluidRow(column(12,verbatimTextOutput("col"))),
          actionButton("action", label = "I'm Done")
        )
      )},
      server = function(input,output,session) {
        outputdata<-  reactive({
          input$col
        })
        output$col <- { 
          renderPrint(outputdata())
        }
        observeEvent(input$action, {
          stopApp()
        })

        session$onSessionEnded(function(){
          message <- paste(isolate(outputdata())," ")
          print(paste("Message: ", message))
          assign("cherrypickedpalette", message, pos =  .GlobalEnv)
          stopApp(cherrypickedpalette)
        })
      }
    )
    )
  }
}

После загрузки всех функций, вызовите блестящее приложение, выберите цвета, закройте приложение с помощью actionButton или закройте окно, и цвета должны быть сохранены в переменной cherrypickedpalette.

library(shiny)
CherryPickPalette("BiryaniRice","Kulfi","Haveli2")
cherrypickedpalette

UPDATE1:

Вы также можете опустить весь процесс onSessionEnded и записать переменную в глобальную среду внутри функции observeEvent.

Удалить функцию сеанса и заменитьtheviewEvent с этим:

    observeEvent(input$action, {
      cherrypickedpalette <<- paste(isolate(outputdata())," ")
      stopApp()
    })

UPDATE2:

Итак, onSessionEnded работает, и проблема на самом деле связана с функцией scan.Кажется, что вы не можете писать напрямую в глобальную среду с помощью этой функции.Но вы можете использовать его для хранения значения и в следующей строке присвоить это значение glob.env.Следующие строки также должны работать, если требуется сохранить значения на диск.

      cherrypickedpalette <- scan(file=colorfile," ")
      cl <<- cherrypickedpalette
...