在 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)
}
我目前正在构建一个闪亮的预算应用程序,它会提示用户输入他们过去交易的信息,例如:金额、类型和描述。每当用户点击提交时,我希望在单独的选项卡中以 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)
}