【问题标题】:How to reactively update data table using reloaded data in shiny?如何使用闪亮的重新加载数据来响应更新数据表?
【发布时间】:2019-09-24 06:55:15
【问题描述】:

我想创建一个显示响应式表格的闪亮应用。我希望能够同时排除某些行并将排除的行保存在我服务器上的 .Rda 文件中。关键是要永久排除某些行,因此每次有人加载闪亮的应用程序时,这些行就已经被排除在外了。

我已经完成了 95% 的工作——我闪亮的应用程序显示表格并将排除的行保存在我服务器上的 .Rda 文件中。当我重新启动应用程序时,会排除正确的行,但是我无法让表动态排除我排除它们的同一会话中的行。基本上,我希望能够按下操作按钮并立即排除行。

这是闪亮的应用程序

library(shiny)
library(tidyverse)

ui <- fluidPage(

      mainPanel(
        DT::dataTableOutput("flag"),
        actionButton("exclude", "Exclude")

      )
   )

server <- function(input, output) {

  df <- data.frame(id = 1:10, fu_score = 1:10,
                   stringsAsFactors = FALSE)

  if (file.exists("data/prev_exclude.Rda")) {
    load("data/prev_exclude.Rda")
  } else {

    prev_exclude <- data.frame(id = 0, fu_score = 0, stringsAsFactors = FALSE)
    save(prev_exclude, file = "data/prev_exclude.Rda")

  }

  df_flag <- reactive({ 
    df %>%
      anti_join(., prev_exclude, by = c("id", "fu_score"))
  })

  output$flag <- DT::renderDataTable({
    DT::datatable(df_flag(), options = list(paging = FALSE))
  })

  selected_prev <- eventReactive(input$flag_rows_selected, {
    data.frame(id = df_flag()$id[c(input$flag_rows_selected)],
               fu_score = df_flag()$fu_score[c(input$flag_rows_selected)])

  })

  observeEvent(input$exclude, {

    prev_exclude <- isolate(bind_rows(selected_prev(), prev_exclude))
    save(prev_exclude, file="data/prev_exclude.Rda")
    load("data/prev_exclude.Rda")
  })

}

# Run the application 
shinyApp(ui = ui, server = server)

再次,我希望能够 1. 在会话期间从显示的表中排除行(即按下操作按钮并删除行)和 2. 保存排除的行以供将来排除。我的代码处理第二部分,但它不会在我的会话期间排除行(仅在重新加载时)。

【问题讨论】:

    标签: r shiny reactive


    【解决方案1】:

    好的,我想通了!我需要将 prev_exclude 数据框存储到 reactiveValues 对象中。

    这是一个有效的例子

    library(shiny)
    library(tidyverse)
    
    ui <- fluidPage(
    
      mainPanel(
        DT::dataTableOutput("flag"),
        actionButton("exclude", "Exclude")
    
      )
    )
    
    server <- function(input, output) {
    
      df <- data.frame(id = 1:10, fu_score = 1:10,
                       stringsAsFactors = FALSE)
    
      if (file.exists("data/prev_exclude.Rda")) {
        load("data/prev_exclude.Rda")
      } else {
    
        prev_exclude <- data.frame(id = 0, fu_score = 0, stringsAsFactors = FALSE)
        save(prev_exclude, file = "data/prev_exclude.Rda")
    
      }
    
      prev_exclude_reactive <- reactiveValues(rv = prev_exclude)
    
      df_flag <- reactive({ 
        df %>%
          anti_join(., prev_exclude_reactive$rv, by = c("id", "fu_score"))
      })
    
      output$flag <- DT::renderDataTable({
        DT::datatable(df_flag(), options = list(paging = FALSE))
      })
    
      selected_prev <- eventReactive(input$flag_rows_selected, {
        data.frame(id = df_flag()$id[c(input$flag_rows_selected)],
                   fu_score = df_flag()$fu_score[c(input$flag_rows_selected)])
    
      })
    
      observeEvent(input$exclude, {
    
        prev_exclude <- isolate(bind_rows(selected_prev(), prev_exclude_reactive$rv))
        save(prev_exclude, file="data/prev_exclude.Rda")
        load("data/prev_exclude.Rda")
    
        prev_exclude_reactive$rv <- prev_exclude
    
      })
    }
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

    希望其他人发现它并觉得它有用。

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 2021-02-13
      • 2019-03-18
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 2017-08-10
      • 2017-12-05
      • 2018-03-28
      相关资源
      最近更新 更多