2016-11-25 320 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