首页 > 解决方案 > 如何根据小部件输入向表中添加行?

问题描述

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

我已经把observeEvent里面的renderTable,但应用程序返回一个错误:不能强制类“c(“观察者”,“R6”)”到一个data.frame

这是要添加行的测试数据框:

> 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)

应用程序

你知道出了什么问题吗?

更新:

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

标签: rshiny

解决方案


如果您只想显示您的表格,您应该将 DF 放在observeEvent 之后,因为“observeEvent 返回一个观察者引用类对象”所以当您有一个时,renderTable您必须返回一个矩阵或 data.frame。

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

编辑1:如果我很好理解您的要求,您不需要保存数据框但您想添加行,它可能是相同的,您只需要使用rbind以下帖子:

将行添加到闪亮表


推荐阅读