Как реактивно обновить таблицу данных, используя перезагруженные данные в блестящем? - PullRequest
0 голосов
/ 06 мая 2019

Я хотел бы создать блестящее приложение, которое отображает реактивную таблицу. Я хотел бы иметь возможность одновременно исключать определенные строки и сохранять исключенные строки в файле .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. сохранять исключенные строки для будущего исключения. Мой код обрабатывает второй кусок, однако он не исключает строки во время моего сеанса (только после перезагрузки).

1 Ответ

0 голосов
/ 08 мая 2019

Хорошо, я понял это! Мне нужно было сохранить фрейм данных 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)

Надеюсь, кто-то еще сталкивается с этим и находит это полезным.

...