如何在闪亮的应用程序中刷新Rdata对象

时间:2020-07-14 15:34:50

标签: r shiny

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

启动该应用程序后,由于DatasetNumber1文件,我默认加载global.R个对象。因此,现在可以通过testdata访问DatasetNumber1的{​​{1}}和server.R对象(不是在此示例中,而是在完整的应用程序中) )。 我希望用户能够通过下拉菜单选择其他数据集,以刷新全局R对象,并最终绘制出图。

server.R中的ui.R语句在选择了下拉列表中的其他数据集之后,单击了print按钮并通过Shinyalert进行了验证,确认下拉列表输入已更改,但是Load语句不会刷新R对象。

我已经尝试在load脚本中使加载直接进行反应,但是结果还是一样。也许渲染的速度比加载的快,所以不会考虑更新的数据来渲染...

无论如何,我都不想重新加载应用程序和会话。

谢谢!

#inputCreation.R

global.R

#global.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")

#ui.R

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

load("DatasetNumber1.Rdata")

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

2 个答案:

答案 0 :(得分:2)

我更改了react_data的初始化。您应该从全局文件中删除<?php endwhile; echo "<div class='paginate_wrap'>"; echo paginate_links ( array ( 'add_fragment' => '#project_area', 'format' => '?paged=%#%', 'current' => max( 1, get_query_var('paged') ), 'total' => $related->max_num_pages, 'prev_text' => '', 'next_text' => '' ) ); echo "</div>"; endif; ?> 。这样,您可以在切换时对数据集进行垃圾收集。否则,它将永远存在于load中。

尝试使用此服务器:

.GlobalEnv

答案 1 :(得分:0)

在@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))
  }
)
相关问题