在 Shiny 中,使用来自用户输入的新值更新 DataTable

dww*_*dww 5 r shiny dt

我正在编写一个闪亮的应用程序,它有一个表(使用DT::renderDataTable),用户可以从中选择一行。但我希望用户也能够添加新行,如果他们想要的东西不在表中。我正在使用输入控件供用户输入新数据,并且我有一个操作按钮,如果按下该按钮,应根据输入值在表中创建新的数据行。但是按下按钮不会更新表格。

一个最小的例子:

library(shiny)
library(DT)
mydata = data.frame(id=letters[1:5], val=sample(10,5,T))

ui = fluidPage(dataTableOutput("table"),
               textInput('NewID', 'Enter new ID'),
               numericInput('NewVal', 'Enter new val', 1),
               actionButton("goButton", "Update Table"))

server = function(input,output){
  output$table = renderDataTable(mydata)
  update = eventReactive(input$goButton, {
    newrow = data.frame(id = input$NewID, val = input$NewVal)
    mydata = rbind(mydata, newrow)
  })
}

shinyApp(ui,server)
Run Code Online (Sandbox Code Playgroud)

显然,这是解决这个问题的错误方法。我已经尝试了各种组合的包装renderDataTable和代码来更新mydata里面renderUI, observeand reactive,但我找不到正确的方法来做到这一点。

这是我的第一个闪亮的应用程序,所以可能有一个我不太理解的基本概念。什么是正确的方法?

Hub*_*rtL 7

您可以渲染 的结果eventReactive,在其中返回更新的数据集。不要忘记使用<<-来修改全局数据集:

server = function(input,output){
  output$table <- renderDataTable( df())
  df <- eventReactive(input$goButton, {
    if(input$NewID!="" && !is.null(input$NewVal) && input$goButton>0){
      newrow = data.table(id = input$NewID,
                        val = input$NewVal)
      mydata <<- rbind(mydata, newrow)
      }
    mydata
  }, ignoreNULL = FALSE)
}
Run Code Online (Sandbox Code Playgroud)