Обновите Shiny DT & SQLite после изменения значений в редактируемом объекте renderDT - PullRequest
0 голосов
/ 03 ноября 2018

Я создал Блестящее приложение для редактируемой панели управления базой данных членства в SQLite. Мой план состоит в том, чтобы использовать пакеты DT и DBI для редактирования определенных значений, а затем отправить обновления обратно в таблицу SQLite, отбросив старую и записав новую вместо нее (еще не закодировала таблицу удаления, но перейду в действия кнопки).

Сторона пользовательского интерфейса ведет себя, как и ожидалось, но когда я редактирую страницу и нажимаю кнопку «Записать в таблицу», а затем перезагружаюсь или закрываюсь из приложения, это не выглядит как DT или база данных обновлена.

Мои вопросы (помимо «Как это может работать?»):

  1. Когда редактируемая функция работает правильно, редактирует ли она long_sepal или данные?
  2. Смогу ли я видеть обновления в Глобальной среде по мере их поступления?

Я включил репрекс с использованием Iris.db в качестве набора данных ниже.

Спасибо! Джастин

library(shiny)
require(shinydashboard)
library(dplyr)
library(RSQLite)
library(DBI)
library(dbplyr)
library(dplyr)
library(DT)

#create SQLite connection and open it
con <- DBI::dbConnect(RSQLite::SQLite(), 
                      "/Users/admin/ICG/iris.db")

src_dbi(con)

#split SQLite datatable into two seperate datatables
data <- tbl(con, "data")
data <- data %>% as.data.frame()
long_sepal <- filter(data, sepal_length>5.5)
short_sepal <- filter(data, sepal_length<5.5)

header <- dashboardHeader(title="Iris Dashboard")

#sidebar with "Write to DB" reactive button
sidebar <- dashboardSidebar(sidebarMenu(
  div(style="display:inline-block;width:32%;text-align: 
      center;",actionButton("action", label = "Write to 
                            DB"))))

#Body element of the dashboard
frow1 <- fluidRow(
  
  box(
    title = "Long Sepal"
    ,status = "primary"
    ,solidHeader = TRUE 
    ,collapsible = TRUE 
    ,DTOutput("table1", height = "300px")
  )
  
  ,box(
    title = "Short Sepal"
    ,status = "primary"
    ,solidHeader = TRUE 
    ,collapsible = TRUE 
    ,DT::dataTableOutput(outputId = "table2", height = 
                           "300px")
  )    
)
# merge into dashBoard body
body <- dashboardBody(frow1)

# Define UI for dashboard page and 
ui <- dashboardPage(title = 'Iris Dashboard', 
                     header, sidebar,
                    body, skin = 'black'
)

# Define server logic required for editable tables
server <- function(input, output) {  
  
  output$table1 <- renderDT(long_sepal, options = 
                              list(scrollX = TRUE), editable = TRUE)
  output$table2 <- renderDT(short_sepal, options = 
                              list(scrollX = TRUE), editable = TRUE)
  
  #necessary code to replace data once edited
  proxy1 = dataTableProxy('table1')
  
  observeEvent(input$x2_cell_edit, {
    info = input$x2_cell_edit
    str(info)
    i = info$row
    j = info$col
    v = info$value
    long_sepal[i, j] <<- DT::coerceValue(v, 
                                            long_sepal[i, j])
    replaceData(proxy1, long_sepal, resetPaging = 
                  TRUE)  # important
  })
  
  #Write to SQLite database
  data <- eventReactive(input$action, {
    dbWriteTable(con, "data", data.frame(data), append 
                 = TRUE)
    data <- dbReadTable(con, "data")
    return(data)
  })  
}

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