【问题标题】:In Shiny, update DataTable with new values from user input在 Shiny 中,使用来自用户输入的新值更新 DataTable
【发布时间】:2017-04-10 06:18:33
【问题描述】:

我正在编写一个闪亮的应用程序,它有一个表格(使用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)

显然,这是处理此问题的错误方法。我尝试了将renderDataTable 和用于在renderUIobserveobservereactive 中更新mydata 的代码包装的各种组合,但我找不到正确的方法。

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

【问题讨论】:

  • Error in force(default) : argument "value" is missing, with no default
  • @HubertL 粘贴并运行代码时出现此错误?对我来说运行正常。
  • 我需要为numericInput()提供value参数
  • 感谢@HubertL - 我现在已将其添加到示例中。必须是版本的东西,由于某种原因,当缺少值时它不会为我抛出错误。

标签: r shiny dt


【解决方案1】:

您可以渲染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)
}

【讨论】:

  • 太棒了!那几乎就在那里。唯一的小问题是它在按下按钮之前添加了一个带有空白 id 的新行。你知道如何抑制它吗?
  • 我添加了一个检查 input$goButton&gt;0 表示该按钮已被点击
【解决方案2】:

您应该使用包 DT 中的 replaceData() 函数。示例:

...
  dataTableOutput("OPreview"),
  actionButton("BRefresh","Refresh"),
...

in server part(assuming ds is a dataset to show):

output$OPreview<-renderDataTable({ ds })

onclick("BRefresh",{
  proxy=dataTableProxy("OPreview")
  replaceData(proxy,ds)
})

【讨论】:

    猜你喜欢
    • 2019-03-14
    • 1970-01-01
    • 2016-07-12
    • 2022-01-17
    • 1970-01-01
    • 2019-08-06
    • 2022-01-17
    • 1970-01-01
    • 2021-12-12
    相关资源
    最近更新 更多