r - 在 R Shiny 中添加和删除 DT Datatable 的行

标签 r shiny dt

我正在尝试向我的 Shiny 应用程序添加“保存输入”功能,其中保存的输入将保存在 DT 数据表中。如果用户点击 添加 按钮,输入将附加到数据表。然后,用户可以通过选择一行并单击 来从此数据表中删除一行。删除 按钮。我还需要将此表的值保存为全局变量,以便它在所有 session 中保持持久性。

示例代码如下所示。当我关闭 session 时,表 ( this_table ) 会正确更新,但是,这些更改不会在应用程序期间实时显示。我试过将这两个输入按钮放在 eventReactive 中功能,但是当其中一个按钮被多次选择时这不起作用。

有任何想法吗?

全局表:
this_table = data.frame(bins = c(30, 50), cb = c(T, F))
Shiny 的应用程序代码:

ui <- fluidPage(

   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
         checkboxInput("cb", "T/F"),
         actionButton("add_btn", "Add"),
         actionButton("delete_btn", "Delete")
      ),

      mainPanel(
         DTOutput("shiny_table")
      )
   )
)

server <- function(input, output) {


  observeEvent(input$add_btn, {
    t = rbind(data.frame(bins = input$bins,
                         cb = input$cb), this_table)
    this_table <<- t
  })

  observeEvent(input$delete_btn, {
    t = this_table
    print(nrow(t))
    if (!is.null(input$shiny_table_rows_selected)) {
      t <- t[-as.numeric(input$shiny_table_rows_selected),]
    }
    this_table <<- t
  })

  output$shiny_table <- renderDT({
   datatable(this_table, selection = 'single', options = list(dom = 't'))
  })
}

shinyApp(ui = ui, server = server)

最佳答案

您可以使用 reactiveVal添加可同时观察和可变的服务器端变量。这些变量的语法是将它们初始化为

rV <- reactiveValue("init_value")

并更新它们
rV("new_value")

这些变量可以在响应式上下文中访问(基本上像 input s)
rV()

R 的语法非常不寻常,可能需要时间来适应,但它绝对是解决此类问题的推荐方法。您可能还想看看 reactiveValues用于类似的功能,但语义更接近 R 类 list .

以下是如何将此技术应用于您的问题
library(shiny)
library(DT)

this_table = data.frame(bins = c(30, 50), cb = c(T, F))

ui <- fluidPage(

  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30),
      checkboxInput("cb", "T/F"),
      actionButton("add_btn", "Add"),
      actionButton("delete_btn", "Delete")
    ),

    mainPanel(
      DTOutput("shiny_table")
    )
  )
)

server <- function(input, output) {

  this_table <- reactiveVal(this_table)

  observeEvent(input$add_btn, {
    t = rbind(data.frame(bins = input$bins,
                         cb = input$cb), this_table())
    this_table(t)
  })

  observeEvent(input$delete_btn, {
    t = this_table()
    print(nrow(t))
    if (!is.null(input$shiny_table_rows_selected)) {
      t <- t[-as.numeric(input$shiny_table_rows_selected),]
    }
    this_table(t)
  })

  output$shiny_table <- renderDT({
   datatable(this_table(), selection = 'single', options = list(dom = 't'))
  })
}

shinyApp(ui = ui, server = server)

最后,我想补充一点,@Vishesh Shrivastavs 建议使用 rhandsontable package 也是一种可行的方法,尽管这样做肯定会失去一些灵活性。

关于r - 在 R Shiny 中添加和删除 DT Datatable 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427281/

相关文章:

r - 为什么不鼓励在 Shiny includeScript() 中使用绝对路径?

r - 将矩阵添加到列表时按名称和维度索引列表元素

r 生成具有给定概率的随机二元结果

r - Slurm:使用来自多个节点的核心进行 R 并行化

r - dbPool 对象过期

r - 从 SelectInput (R Shiny) 中的一组选项列表中获取组标签

R Shiny DT - 用 react 编辑表中的值

r - 根据 plotly click 事件子集数据框

r - 数据表不会在 Shiny Dashboard 中呈现

r - 在 gvisMotionChart 中绘制离去图