【问题标题】:How to update datatable on click of actionButton?如何在单击 actionButton 时更新数据表?
【发布时间】:2019-02-26 16:25:18
【问题描述】:

所以我在 Shiny 中有一个数据表,我只想在用户更改输入参数并单击按钮时更新它。以下是它的最小可重现示例:

library(dplyr)
library(DT)
library(shiny)

ui <- fluidPage(
  fluidRow(
    column(3, numericInput("num1", "Limiter1", value = 0)),
    column(3, numericInput("num2", "Limiter2", value = 0))
  ),
  fluidRow(
    column(3,actionButton("button1", "Apply filters1")),
    column(3,actionButton("button2", "Apply filters2"))
  ),
  fluidRow(
    column(6,dataTableOutput("testtable1")),
    column(6,dataTableOutput("testtable2"))
  )
)

server <- function(input, output, session) {
  filteredData1 <- reactive({
    req(input$num1)
    iris %>%
      filter(Petal.Length >= input$num1)
  })

  observeEvent(input$button1, {
    updateNumericInput(session, "num2", value = input$num1)

    output$testtable1 <- renderDataTable(datatable(filteredData1()))
  })

  filteredData2 <- reactive({
    req(input$num2)
    iris %>%
      filter(Petal.Length >= input$num2)
  })

  observeEvent(input$button2, {
    output$testtable2 <- renderDataTable(datatable(filteredData2()))
  })
}

shinyApp(ui, server)

不幸的是,在这种情况下,数据表会在用户单击按钮时首先加载,但之后会在每次 input$num1 更改时自动更新,无论是否单击 button1。有没有办法只在点击button1 时才用新参数更新表格?

【问题讨论】:

标签: r datatable shiny


【解决方案1】:

如果应用程序如此简单,您只需将actionButton 更改为submitButton

library(dplyr)
library(DT)
library(shiny)

ui <- fluidPage(
  fluidRow(
    numericInput("num1", "Limiter", value = 0)
    ),
  fluidRow(
    submitButton("button1", "Apply filters")
    ),
  fluidRow(
    dataTableOutput("testtable")
    )
)

server <- function(input, output, session) {
  filteredData <- reactive({
    req(input$num1)
    iris %>%
      filter(Petal.Length >= input$num1)
  })

  output$testtable <- renderDataTable(datatable(filteredData()))
}

shinyApp(ui, server)

【讨论】:

  • 我已经更新了代码,因为它不像我想象的那么简单。本质上,我想要的流程是:更改num1 -> 单击button1 以更新testtable1num2 -> 单击button2 以更新testtable2
【解决方案2】:

带有反应值:

library(dplyr)
library(DT)
library(shiny)

ui <- fluidPage(
  fluidRow(
    numericInput("num1", "Limiter", value = 0)
  ),
  fluidRow(
    actionButton("button1", "Apply filters")
  ),
  fluidRow(
    dataTableOutput("testtable")
  )
)

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

  filteredData <- reactiveVal(iris)
  observeEvent(input$button1, {
    filteredData(iris %>% filter(Petal.Length >= input$num1))
  })

  output$testtable <- renderDataTable(datatable(filteredData()))
}

shinyApp(ui, server)

【讨论】:

  • 这似乎是我需要实现它的方式!你能解释一下这是如何工作的吗?
  • @AnirudhNambiar 看看文档(?reactiveVal),很好。
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多