如何基于小部件输入向表添加行?

时间:2019-06-11 15:21:48

标签: r shiny

我试图在单击按钮时根据小部件的选择将行添加到数据框。

我已将observeEvent放在renderTable内,但是应用程序返回错误:无法将类“ c(“ Observer”,“ R6”)“强制转换为数据。框架

这是向以下行添加数据的测试数据框:

> DF <- data.frame(matrix(c("A","B"), ncol = 2), stringsAsFactors = FALSE)
> colnames(DF) <- c("col1", "col2")
> DF
  col1 col2
1    A    B

这是闪亮的应用程序代码:

library(shiny)

DF <- data.frame(matrix(c("A","B"), ncol = 2), stringsAsFactors = FALSE)
colnames(DF) <- c("col1", "col2")

ui <- fluidPage(

  titlePanel("Save input"),

  sidebarLayout(
    sidebarPanel(

      wellPanel(
        h3("Widget 1"),
        radioButtons("add", "Letter", c("A", "B", "C"))
      ),

      wellPanel(
        h3("Save button"),
        actionButton("save", "Save")       
      )
    ),

    mainPanel(
      tableOutput("table")
    )
  )
)

server <- function(input, output) {

  output$table <- renderTable({
    DF

    observeEvent(input$save, {
      l <- nrow(DF)
      DF[l+1,] <- list(input$add, input$add)
    })

  })

}

shinyApp(ui = ui, server = server)

App

你知道怎么了吗?

更新:

使用@Rémi回答,错误消失了,但应用程序未向表中添加新行:app

1 个答案:

答案 0 :(得分:0)

如果只想显示表,则应将DF放在observeEvent之后,因为“ observeEvent返回观察者参考类对象”,因此当您拥有renderTable时,必须返回矩阵或data.frame。 / p>

server <- function(input, output) {
  output$table <- renderTable({
    observeEvent(input$save, {
      l <- nrow(DF)
      DF[l+1,] <- list(input$add, input$add)
    })
    DF
  })
}

编辑1: 如果我很了解您的请求,则无需保存数据框,但您想添加行,也可以相同,只需使用rbind作为以下文章的摘要即可:

Add row to shinyTable