【问题标题】:How to refresh Rdata objects in shiny app如何在闪亮的应用程序中刷新数据对象
【发布时间】:2020-11-03 23:58:30
【问题描述】:

我的目标是在用户通过闪亮警报弹出窗口确认数据集重新加载时刷新 .Rdata 对象。下面是一个小例子。在加载应用程序之前,我创建并保存了 2 个对象(DatasetNumber1DatasetNumber2),其中包含要显示的标签和数据。

当应用程序启动时,我默认加载 DatasetNumber1 对象,这要归功于 global.R 文件。所以现在DatasetNumber1 中的testdata 对象可以通过server.Rui.R 访问,这是我需要的(不是在这个例子中,而是在我的完整应用程序中)。 我希望用户能够通过下拉列表选择其他数据集以刷新全局 R 对象并最终进行绘图。

server.R 中的print 语句,在我选择下拉列表中的其他数据集后,单击Load 按钮并通过shinyalert 验证,确认下拉输入已更改,但load语句不会刷新 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")
        )
    )
  )
)

#server.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))
  }
)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我更改了 react_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()))
      }
    )
    

    【讨论】:

    • 感谢编辑!在我的Rdata 对象中,我有多个变量要捕获。在您的示例中,test 未找到
    【解决方案2】:

    在@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))
      }
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-24
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      相关资源
      最近更新 更多