【问题标题】:How to make table reactively updating如何使表反应性更新
【发布时间】:2020-02-03 14:50:57
【问题描述】:

我尝试制作一个显示响应式更新表格的应用。它由两部分组成: 1.输入和保存用户数据的表格(有效)。 2. 表,每次用户添加新行时都会从 MySQL 中重新更新数据。

我的应用程序的简化版:

library(shiny)
library(shinyWidgets)

con <- dbConnect(RMySQL::MySQL(), dbname = "test", username = "root", password = "123456", host = "127.0.0.1", port = 3306)


ui <- fluidPage(
  textInput("name", "name"),
  numericInput("age", "age", value = 1),
  actionButton("ok", "ok"),
  titlePanel(h2("My burnmarks")),
  br(),
  DT::dataTableOutput("table")
)

server <- function(input, output, session) {

  observeEvent(input$ok, {
    query <- paste("INSERT INTO test (name, age) VALUES ('", 
                   input$name , "', '",input$age, "');", sep = "")
    dbExecute(con, query)
  })


  sqlOutput <- reactive({
    sqlInput <- "SELECT * from test"
    dbGetQuery(con, sqlInput)
  })


  output$table <- DT::renderDataTable(sqlOutput(),
                                      server = TRUE, rownames = FALSE,
                                      options = list(
                                        pageLength = 10,
                                        scrollX = TRUE,
                                        fixedColumns = TRUE),
                                      extensions = 'Responsive'
  )

  }
shinyApp(ui, server)


【问题讨论】:

标签: mysql r shiny


【解决方案1】:

如下所示,使用eventReactive 而不是reactive

library(shiny)
library(shinyWidgets)
library(DBI)
library(pool)
pool <- dbPool(drv = RMySQL::MySQL(),dbname = "test",host = "host",username = "root",password = "pwd", port = 3306, unix.sock = "/var/run/mysqld/mysqld.sock")

ui <- fluidPage(
  textInput("name", "name"),
  numericInput("age", "age", value = 1),
  actionButton("ok", "ok"),
  titlePanel(h2("My burnmarks")),
  br(),
  DT::dataTableOutput("table")
)

server <- function(input, output, session) {
  observeEvent(input$ok, {
    dbGetQuery(pool, paste0("INSERT INTO test (name, age) VALUES ('", input$name , "', '",input$age, "');", sep = ""))
  })

sqlOutput <- eventReactive(input$ok, {
    op <- dbGetQuery(pool, "SELECT * FROM test;")
})

output$table <- DT::renderDataTable(sqlOutput(),
                                      server = TRUE, rownames = FALSE,
                                      options = list(
                                        pageLength = 10,
                                        scrollX = TRUE,
                                        fixedColumns = TRUE),
                                      extensions = 'Responsive'
  )

}
shinyApp(ui, server)

另外reactiveValues 是另一个实现相同功能的函数。

server <- function(input, output, session) {
  values <- reactiveValues(df_data = NULL)
  observeEvent(input$ok, {
    dbGetQuery(pool, paste0("INSERT INTO test (name, age) VALUES ('", input$name , "', '",input$age, "');", sep = ""))
    values$df_data <- dbGetQuery(pool, "SELECT * FROM test;")
  })

  output$table <- DT::renderDataTable(values$df_data,
                                      server = TRUE, rownames = FALSE,
                                      options = list(
                                        pageLength = 10,
                                        scrollX = TRUE,
                                        fixedColumns = TRUE),
                                      extensions = 'Responsive'
  )
}

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多