在 Shiny 中将反应性数据 Table 转换为 Kable

Converting Reactive Data Table to Kable in Shiny

我目前正在构建一个闪亮的预算应用程序,它会提示用户输入他们过去交易的信息,例如:金额、类型和描述。每当用户点击提交时,我希望在单独的选项卡中以 Kable 样式 table 显示此信息,但是,当我这样做时,我收到以下消息并且 table 不显示:
“警告:as.data.frame.default 中的错误:无法将 class ‘c("kableExtra", "knitr_kable")' 强制转换为 data.frame"

这是我目前编写的代码:

# Libraries
library(shiny)
library(ggplot2)
library(shinythemes)
library(DT)
library(kableExtra)

ui <- fluidPage(
    theme = shinytheme("spacelab"),
    
    ## Application Title
    titlePanel("2021 Budgeting & Finances"),
    tags$em("By:"),
    tags$hr(),

    navbarPage("", id = "Budget",
        tabPanel("Data Entry",
                 div(class = "outer",
                # Sidebar Layout 
                sidebarLayout(
                    sidebarPanel(
                        selectInput("Name", 
                                    label = "Name:", 
                                    choices = c("","Jack", "Jill")),
                        selectInput("Bucket",
                                    label = "Item Bucket:",
                                    choices = c("","Essential", "Non-Essential", "Savings", "Rent/Bills", "Trip", "Other")),
                        textInput("Item", 
                                  label = "Item Name:",
                                  placeholder = "Ex: McDonald's"),
                        shinyWidgets::numericInputIcon("Amount", 
                                                       "Amount:", 
                                                       value = 0, 
                                                       step = 0.01, 
                                                       min = 0, 
                                                       max = 1000000, 
                                                       icon = list(icon("dollar"), NULL)),
                        dateInput("Date",
                                  label = "Date",
                                  value = Sys.Date(),
                                  min = "2021-05-01",
                                  max = "2022-12-31",
                                  format = "M-d-yyyy"),
                        actionButton("Submit", "Submit", class = "btn btn-primary"),
                        downloadButton("Download", "Download")),
                    # Show a plot of the generated distribution
                    mainPanel(
                       dataTableOutput("PreviewTable")
                    )
                )
            )
        ),
        tabPanel("Monthly Budget",
                 tableOutput("MonthlyTable")
        ),
        tabPanel("Budget to Date",
                 tableOutput("YearTable")
        )
    )
)


server <- function(input, output, session) {
    ## SAVE DATA
    # Set Up Empty DF
    df <- tibble("Name" = character(),
                 "Date" = character(),
                 "Category" = character(),
                 "Amount" = numeric(),
                 "Description" = character())
    # DF is made reactive so we can add new lines
    ReactiveDf <- reactiveVal(value = df)
    
    # Add inputs as new data (lines)
    observeEvent(input$Submit, {
        if (input$Bucket == "" | input$Amount == 0 |
            is.na(input$Amount)) {
            return(NULL) 
        } 
        
        else {
            # New lines are packaged together in a DF
            new_lines <- data.frame(Name = as.character(input$Name),
                                    Date = as.character(input$Date),
                                    Category = input$Bucket,
                                    Amount = as.character(input$Amount),
                                    Description = as.character(input$Item))
            
            # change df globally
            df <<-  rbind(df, new_lines)
            
            # ensure amount is numeric
            df <<- df %>%
                mutate("Amount" = as.numeric(Amount))
            
            # Update reactive values
            ReactiveDf(df)
            
            #clear out original inputs now that they are written to df
            updateSelectInput(session, inputId = "Name", selected = "")
            updateSelectInput(session, inputId = "Bucket", selected = "")
            updateNumericInput(session, inputId = "Amount", value = 0)
            updateTextInput(session, inputId = "Item", value = "")
        }
    })
        
    ## Preview Table
    output$PreviewTable <- renderTable({
          ReactiveDf()
    })
             
    ## MONTHLY TABLE
    output$MonthlyTable <- renderTable({
              ReactiveDf() %>%
                   kbl()
    })
    
    ## YEAR TO DATE TABLE
    output$YearTable <- renderTable({
        ReactiveDf()
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

理想情况下,我希望在主页上有一个 table 预览,用户可以在其中输入他们的信息,一旦用户提交了他们的数据,这些信息就会更新。然后,我希望月份选项卡仅填充与当前月份相关的数据,而年份选项卡则包含当年的所有信息。然而,目前最大的问题是电缆 table 没有显示。非常感谢任何帮助!

Kable 很简单 Html 所以它不需要特殊的渲染功能。这应该有效。

## MONTHLY TABLE
output$MonthlyTable <- function(){
    ReactiveDf() %>%
        kable("html") %>%
        kable_styling("striped", full_width = TRUE)
}