繁体   English   中英

在R Shiny中添加和删除DT数据表的行

[英]Add and delete rows of DT Datatable in R Shiny

我试图在我的Shiny应用程序中添加“保存输入”功能,将保存的输入保存在DT数据表中。 如果用户单击“ 添加”按钮,则输入将附加到数据表中。 然后,用户可以通过选择一行并单击“ 删除”按钮来从此数据表中删除一行。 我还需要将该表的值另存为全局变量,以使其在所有会话中保持不变。

示例代码如下所示。 当我关闭会话时,表( this_table )已正确更新,但是,这些更改在应用程序期间不会实时显示。 我尝试将这两个输入按钮都放在eventReactive函数中,但是当多次选择一个按钮时,此方法不起作用。

有任何想法吗?

全局表:

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) {


  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 )内访问这些变量,方法如下:

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)

最后,我想补充一点,即rhandsontable Shrivastavs建议使用rhandsontable软件包也是一种可行的方法,尽管您肯定会失去一些灵活性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM