光沢のあるアプリのユーザーがテーブルに要素を繰り返し追加できるようにしたいのですが、値を保持する方法がわかりません。
この例では、ユーザーがテキストボックスに値を追加できるようにします。テキストボックスは、メインパネルのテーブルの下部に追加されます。現時点では、以前に追加された値は失われます。
library(shiny)
runApp(list(
ui=pageWithSidebar(headerPanel("Adding entries to table"),
sidebarPanel(textInput("text1", "Column 1"),
textInput("text2", "Column 2"),
actionButton("update", "Update Table")),
mainPanel(tableOutput("table1"))),
server=function(input, output, session) {
tableStart <- data.frame(Column1 = NA, Column2 = NA)
newEntry <- reactive({
input$update
newLine <- isolate(c(input$text1, input$text2))
})
output$table1 <- renderTable({rbind(tableStart, newEntry())})
}))
reactiveValues()
を使用してデータフレームを保存したいと思います。考えられる解決策は次のとおりです。
_library(shiny)
runApp(list(
ui=pageWithSidebar(headerPanel("Adding entries to table"),
sidebarPanel(textInput("text1", "Column 1"),
textInput("text2", "Column 2"),
actionButton("update", "Update Table")),
mainPanel(tableOutput("table1"))),
server=function(input, output, session) {
values <- reactiveValues()
values$df <- data.frame(Column1 = NA, Column2 = NA)
newEntry <- observe({
if(input$update > 0) {
newLine <- isolate(c(input$text1, input$text2))
isolate(values$df <- rbind(values$df, newLine))
}
})
output$table1 <- renderTable({values$df})
}))
_
空の行の作成を回避するには、NA
を使用するのではなく、空のdata.frameを作成します。
_values$df <- data.frame(Column1 = numeric(0), Column2 = numeric(0))
_
また、行を追加するには、rbind()
(列名を台無しにする...理由はわかりません)よりもインデックス付けの方が適しているようです。
_isolate(values$df[nrow(values$df) + 1,] <- c(input$text1, input$text2))
_