使用反应性数据框时如何格式化数据 table 值?
How to format data table values when using a reactive data frame?
在下面的 MWE 代码中,我之前使用的是 base Shiny renderTable()
并使用这行简单的代码成功地格式化了数据 table 输出:format1 <- function(x){format(x, nsmall = 2, big.mark=",")}
.
但是由于下面的 MWE 被部署在一个处理更大数据框的应用程序中,我切换到 DT 包来呈现数据 tables,因为它有明显的好处。
但是,我在 DT 之前使用的用于格式化 table 输出的旧代码不适用于 DT!因此,使用 DT 包,我如何格式化指定列(在本例中为 ColA 和 ColB)的数字输出,以便它们显示 2 个小数,每 3 个 0 由“,”分隔,并且可能能够显示货币例如指定列开头的 €?我不希望所有列都以相同的方式自动格式化,因为完整应用程序的数据 table 比此 MWE 中的数据更复杂,某些列将需要不同的格式。
我研究了 DT 格式化解决方案,但我似乎碰壁了,因为我的数据框是反应式的。
MWE 代码:
library(dplyr)
library(DT)
library(shiny)
library(tidyverse)
ui <-
fluidPage(
h3("Data table:"),
tableOutput("data"),
h3("Sum the data table columns:"),
radioButtons(
inputId = "grouping",
label = NULL,
choiceNames = c("By period 1", "By period 2"),
choiceValues = c("Period_1", "Period_2"),
selected = "Period_1",
inline = TRUE
),
DT::dataTableOutput("sums")
)
server <- function(input, output, session) {
data <- reactive({
data.frame(
Period_1 = c("2020-01", "2020-02", "2020-03", "2020-01", "2020-02", "2020-03"),
Period_2 = c(1, 2, 3, 3, 1, 2),
ColA = c(1000.01, 20, 30, 40, 50, 60),
ColB = c(15.06, 25, 35, 45, 55, 65)
)
})
summed_data <- reactive({
data() %>%
group_by(!!sym(input$grouping)) %>%
select("ColA","ColB") %>%
summarise(across(everything(), sum))
})
output$data <- renderTable(data())
output$sums <- renderDT(summed_data(),rownames = FALSE)
}
shinyApp(ui, server)
DT
包提供了几个格式化程序 functions 来格式化 table 列,例如在你的情况下 formatCurrency
似乎是合适的:
library(dplyr)
library(DT)
library(shiny)
library(tidyverse)
ui <-
fluidPage(
h3("Data table:"),
tableOutput("data"),
h3("Sum the data table columns:"),
radioButtons(
inputId = "grouping",
label = NULL,
choiceNames = c("By period 1", "By period 2"),
choiceValues = c("Period_1", "Period_2"),
selected = "Period_1",
inline = TRUE
),
DT::dataTableOutput("sums")
)
server <- function(input, output, session) {
data <- reactive({
data.frame(
Period_1 = c("2020-01", "2020-02", "2020-03", "2020-01", "2020-02", "2020-03"),
Period_2 = c(1, 2, 3, 3, 1, 2),
ColA = c(1000.01, 20, 30, 40, 50, 60),
ColB = c(15.06, 25, 35, 45, 55, 65)
)
})
summed_data <- reactive({
data() %>%
group_by(!!sym(input$grouping)) %>%
select("ColA","ColB") %>%
summarise(across(everything(), sum))
})
output$data <- renderTable(data())
output$sums <- renderDT({
summed_data() %>%
datatable(rownames = FALSE) %>%
formatCurrency(c("ColA", "ColB"), currency = '\U20AC', digits = 2)
})
}
shinyApp(ui, server)
#>
#> Listening on http://127.0.0.1:3057
#> Adding missing grouping variables: `Period_1`
在下面的 MWE 代码中,我之前使用的是 base Shiny renderTable()
并使用这行简单的代码成功地格式化了数据 table 输出:format1 <- function(x){format(x, nsmall = 2, big.mark=",")}
.
但是由于下面的 MWE 被部署在一个处理更大数据框的应用程序中,我切换到 DT 包来呈现数据 tables,因为它有明显的好处。
但是,我在 DT 之前使用的用于格式化 table 输出的旧代码不适用于 DT!因此,使用 DT 包,我如何格式化指定列(在本例中为 ColA 和 ColB)的数字输出,以便它们显示 2 个小数,每 3 个 0 由“,”分隔,并且可能能够显示货币例如指定列开头的 €?我不希望所有列都以相同的方式自动格式化,因为完整应用程序的数据 table 比此 MWE 中的数据更复杂,某些列将需要不同的格式。
我研究了 DT 格式化解决方案,但我似乎碰壁了,因为我的数据框是反应式的。
MWE 代码:
library(dplyr)
library(DT)
library(shiny)
library(tidyverse)
ui <-
fluidPage(
h3("Data table:"),
tableOutput("data"),
h3("Sum the data table columns:"),
radioButtons(
inputId = "grouping",
label = NULL,
choiceNames = c("By period 1", "By period 2"),
choiceValues = c("Period_1", "Period_2"),
selected = "Period_1",
inline = TRUE
),
DT::dataTableOutput("sums")
)
server <- function(input, output, session) {
data <- reactive({
data.frame(
Period_1 = c("2020-01", "2020-02", "2020-03", "2020-01", "2020-02", "2020-03"),
Period_2 = c(1, 2, 3, 3, 1, 2),
ColA = c(1000.01, 20, 30, 40, 50, 60),
ColB = c(15.06, 25, 35, 45, 55, 65)
)
})
summed_data <- reactive({
data() %>%
group_by(!!sym(input$grouping)) %>%
select("ColA","ColB") %>%
summarise(across(everything(), sum))
})
output$data <- renderTable(data())
output$sums <- renderDT(summed_data(),rownames = FALSE)
}
shinyApp(ui, server)
DT
包提供了几个格式化程序 functions 来格式化 table 列,例如在你的情况下 formatCurrency
似乎是合适的:
library(dplyr)
library(DT)
library(shiny)
library(tidyverse)
ui <-
fluidPage(
h3("Data table:"),
tableOutput("data"),
h3("Sum the data table columns:"),
radioButtons(
inputId = "grouping",
label = NULL,
choiceNames = c("By period 1", "By period 2"),
choiceValues = c("Period_1", "Period_2"),
selected = "Period_1",
inline = TRUE
),
DT::dataTableOutput("sums")
)
server <- function(input, output, session) {
data <- reactive({
data.frame(
Period_1 = c("2020-01", "2020-02", "2020-03", "2020-01", "2020-02", "2020-03"),
Period_2 = c(1, 2, 3, 3, 1, 2),
ColA = c(1000.01, 20, 30, 40, 50, 60),
ColB = c(15.06, 25, 35, 45, 55, 65)
)
})
summed_data <- reactive({
data() %>%
group_by(!!sym(input$grouping)) %>%
select("ColA","ColB") %>%
summarise(across(everything(), sum))
})
output$data <- renderTable(data())
output$sums <- renderDT({
summed_data() %>%
datatable(rownames = FALSE) %>%
formatCurrency(c("ColA", "ColB"), currency = '\U20AC', digits = 2)
})
}
shinyApp(ui, server)
#>
#> Listening on http://127.0.0.1:3057
#> Adding missing grouping variables: `Period_1`