Как обновить объекты sh Rdata в блестящем приложении - PullRequest
1 голос
/ 14 июля 2020

Моя цель - обновить sh .Rdata объектов, когда пользователь подтверждает перезагрузку набора данных с помощью всплывающего всплывающего сообщения. Небольшой пример ниже. Перед загрузкой приложения я создал и сохранил 2 объекта (DatasetNumber1 и DatasetNumber2), содержащих метку и данные для отображения.

Когда приложение запускается, я загружаю по умолчанию DatasetNumber1 объектов, спасибо в файл global.R. Итак, теперь объекты test и data из DatasetNumber1 доступны через server.R И ui.R, что мне нужно (не в этом примере, а в моем полном приложении). Я хочу, чтобы пользователь мог выбрать другой набор данных в раскрывающемся списке, чтобы обновить sh глобальные объекты R и, в конце концов, построить график.

Оператор print в server.R после того, как я Выбрал другой набор данных в раскрывающемся списке, нажал кнопку Load и подтвердил с помощью shinyalert, подтверждает, что ввод раскрывающегося списка изменился, но оператор load не обновляет объекты sh R.

Я пытался сделать загрузку реактивной прямо в скрипте global.R, но закончил с тем же результатом. Может быть, рендеринг происходит быстрее, чем загрузка, и поэтому обновленные данные не учитываются для рендеринга ...

В любом случае я не хочу перезагружать ни приложение, ни сеанс.

Спасибо!

# inputCreation.R

test <- "IamDatasetNumber1"
data <- c(1, 3, 6, 4, 9)
save(test, data, file = "./Test/DatasetNumber1.Rdata")

test <- "IamDatasetNumber2"
data <- c(2, 7, 9, 12, 13)
save(test, data, file = "./Test/DatasetNumber2.Rdata")

# global.R

library(shiny)
library(shinyjs)
library(shinyalert)

load("DatasetNumber1.Rdata")

# ui.R

shinyUI(
  fluidPage(
    useShinyjs(),
    div(
        id = "main_page",
        fluidRow( # -------------------------------------------------------
                  column(
                    2, offset=0,
                    selectInput("dropdown_dataset", "Dataset :", choices=c("DatasetNumber1", "DatasetNumber2"), selected="DatasetNumber1")
                  ),
                  column(
                    1, offset=0,
                    useShinyalert(),
                    actionButton("button_dataset", "Load"),
                  )
        ),
        fluidRow( # -------------------------------------------------------
                  uiOutput("test_text")
        ),
        fluidRow( # -------------------------------------------------------
                  plotOutput("test_plot")
        )
    )
  )
)

# сервер .R

shinyServer(
  function(input, output, session) {
    
    observeEvent(input$button_dataset, {
      shinyalert(title = "Are you sure?",
                 text = "This action can take a while",
                 type = "warning",
                 closeOnEsc = TRUE,
                 closeOnClickOutside = TRUE,
                 showCancelButton = TRUE,
                 showConfirmButton = TRUE,
                 confirmButtonText = "OK",
                 confirmButtonCol = "#AEDEF4",
                 cancelButtonText = "Cancel",
                 inputId = "shinyalert",
                 callbackR = function(x){
                   if(x){
                     showModal(modalDialog("Loading...", footer=NULL))
                     print(paste(input[["dropdown_dataset"]],sep=""))
                     load(paste(input[["dropdown_dataset"]],".Rdata",sep=""))
                     removeModal()
                   }
                 }
      )
    })
    output$test_text <- renderText(test)
    output$test_plot <- renderPlot(plot(data))
  }
)

Ответы [ 2 ]

2 голосов
/ 15 июля 2020

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

Попробуйте этот сервер:

shinyServer(
  function(input, output, session) {

    react_data <- reactiveVal()
    react_data(local({load("DatasetNumber1.Rdata"); data}))

    observeEvent(
      input$shinyalert,
      {
        req(input$shinyalert)
        load(paste(input$dropdown_dataset,".Rdata",sep=""))
        react_data(data)
      })


    observeEvent(input$button_dataset, {
      shinyalert(title = "Are you sure?",
                 text = "This action can take a while",
                 type = "warning",
                 closeOnEsc = TRUE,
                 closeOnClickOutside = TRUE,
                 showCancelButton = TRUE,
                 showConfirmButton = TRUE,
                 confirmButtonText = "OK",
                 confirmButtonCol = "#AEDEF4",
                 cancelButtonText = "Cancel",
                 inputId = "shinyalert",
                 callbackR = function(x){
                   if(x){
                     showModal(modalDialog("Loading...", footer=NULL))
                     print(paste(input[["dropdown_dataset"]],sep=""))
                     removeModal()
                   }
                 }
      )
    })
    output$test_text <- renderText(test)
    output$test_plot <- renderPlot(plot(react_data()))
  }
)
0 голосов
/ 16 июля 2020

С помощью @Tyler!

# server.R

shinyServer(
  function(input, output, session) {
    
    react <- reactiveVal()
    react(local({load("DatasetNumber1.Rdata"); list(test=test,data=data)}))

    observeEvent(
      input$shinyalert,
      {
        req(input$shinyalert)
        load(paste(input$dropdown_dataset,".Rdata",sep=""))
        react(list(test=test,data=data))
      })


    observeEvent(input$button_dataset, {
      shinyalert(title = "Are you sure?",
                 text = "This action can take a while",
                 type = "warning",
                 closeOnEsc = TRUE,
                 closeOnClickOutside = TRUE,
                 showCancelButton = TRUE,
                 showConfirmButton = TRUE,
                 confirmButtonText = "OK",
                 confirmButtonCol = "#AEDEF4",
                 cancelButtonText = "Cancel",
                 inputId = "shinyalert",
                 callbackR = function(x){
                   if(x){
                     showModal(modalDialog("Loading...", footer=NULL))
                     print(paste(input[["dropdown_dataset"]],sep=""))
                     removeModal()
                   }
                 }
      )
    })
    output$test_text <- renderText(react()$test)
    output$test_plot <- renderPlot(plot(react()$data))
  }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...