2016-11-25 324 views
1

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

小例子:

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和更新mydatarenderUI,observereactive的代码,但我找不到正确的方法来做到这一点。

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

+0

'错误生效(默认):参数“价值”的缺失,没有default' – HubertL

+0

@HubertL你得到这个错误时,粘贴和运行代码?它对我来说运行正常。 – dww

+0

我需要为'numericInput()'提供'value'参数' – HubertL

回答

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) 
} 
+0

优秀!那几乎是那里。唯一的小问题是,在按钮被按下之前,它会添加一个带有空白标识的新行。你知道如何抑制? – dww

+0

我添加了一个检查'输入$ goButton> 0'表示按钮已被点击 – HubertL

+0

现在会抛出一个错误 – user5249203