在 Shiny 中,使用用户输入的新值更新 DataTable
In Shiny, update DataTable with new values from user input
我正在编写一个闪亮的应用程序,它有一个 table(使用 DT::renderDataTable
),用户可以从中连续 select。但我希望用户也能够添加新行(如果他们想要的内容不在 table 中)。我正在使用输入控件供用户输入新数据,并且我有一个操作按钮,如果按下该按钮,应该会根据输入值在 table 中创建一个新数据行。但是按下按钮不会更新 table.
一个最小的例子:
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
和代码的组合以在 renderUI
、observe
和 reactive
中更新 mydata
,但我找不到正确的方法。
这是我的第一个闪亮的应用程序,所以可能有一个我不太了解的基本概念。什么是正确的方法?
您可以呈现 eventReactive
的结果,其中 return 更新的数据集。不要忘记使用 <<-
来修改全局数据集:
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)
}
您应该使用 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)
})
我正在编写一个闪亮的应用程序,它有一个 table(使用 DT::renderDataTable
),用户可以从中连续 select。但我希望用户也能够添加新行(如果他们想要的内容不在 table 中)。我正在使用输入控件供用户输入新数据,并且我有一个操作按钮,如果按下该按钮,应该会根据输入值在 table 中创建一个新数据行。但是按下按钮不会更新 table.
一个最小的例子:
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
和代码的组合以在 renderUI
、observe
和 reactive
中更新 mydata
,但我找不到正确的方法。
这是我的第一个闪亮的应用程序,所以可能有一个我不太了解的基本概念。什么是正确的方法?
您可以呈现 eventReactive
的结果,其中 return 更新的数据集。不要忘记使用 <<-
来修改全局数据集:
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)
}
您应该使用 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)
})