在 R Shiny 中使用 renderTable 时如何格式化数字行输出?
How to format numeric row outputs when using renderTable in R Shiny?
在 运行 以下 MWE 代码时呈现的 4 行 table 中,我希望前两行中的值不带小数,最后两行中的值要呈现的 2 行小数到百分之一和一个 % 符号。如最底部的图像所示,在第一次调用时的默认视图的情况下。此格式适用于首次调用应用程序和修改应用程序时呈现的默认 table(adding/deleting 行)。
有没有有效的方法来做到这一点?也许,如果可能的话,不添加功能(将其嵌入下面的 output$table3 <- renderTable(..
部分)?
MWE 代码:
library(shiny)
library(shinyMatrix)
library(magrittr)
# Default matrix for initializing
matrix3DefaultRownames <- c("A", "B", "C", "D")
matrix3Default <- data.frame('Series 1' = c(1, 24, 0, 100), row.names = matrix3DefaultRownames) %>% as.matrix()
matrix3Input <- function(inputId, matrix3Default) {
matrixInput(
inputId = inputId,
label = "Input terms:",
value = matrix3Default,
rows = list(extend = FALSE, names = TRUE),
cols = list(extend = TRUE, names = TRUE, editableNames = FALSE, delete = TRUE),
class = "numeric"
)
}
ui <- fluidPage(titlePanel("Inputs"), fluidRow(actionButton("modify", "Modify"), tableOutput("table3")))
server <- function(input, output, session) {
rv <- reactiveValues(
mat3 = matrix3Input("matrix3", matrix3Default),
input = matrix3Default,
colHeader = colnames(input)
)
observeEvent(input$modify, {
showModal(modalDialog(rv$mat3))
})
output$table3 <- renderTable(
{
if (isTruthy(input$modify)) {
req(input$matrix3)
df <- input$matrix3
rv$mat3 <- matrix3Input("matrix3", df)
colnames(df) <- paste("Series", 1:ncol(df))
rownames(df) <- matrix3DefaultRownames
rv$input <- df
} else {
df <- matrix3Default
colnames(df) <- paste("Series", 1:ncol(df))
rownames(df) <- matrix3DefaultRownames
}
df
},
rownames = TRUE,
colnames = TRUE
)
}
shinyApp(ui, server)
您可以使用 sprintf
-
执行此格式化
library(shiny)
library(shinyMatrix)
library(magrittr)
# Default matrix for initializing
matrix3DefaultRownames <- c("A", "B", "C", "D")
matrix3Default <- data.frame('Series 1' = c(1, 24, 0, 100), row.names = matrix3DefaultRownames) %>% as.matrix()
matrix3Input <- function(inputId, matrix3Default) {
matrixInput(
inputId = inputId,
label = "Input terms:",
value = matrix3Default,
rows = list(extend = FALSE, names = TRUE),
cols = list(extend = TRUE, names = TRUE, editableNames = FALSE, delete = TRUE),
class = "numeric"
)
}
ui <- fluidPage(titlePanel("Inputs"), fluidRow(actionButton("modify", "Modify"), tableOutput("table3")))
server <- function(input, output, session) {
rv <- reactiveValues(
mat3 = matrix3Input("matrix3", matrix3Default),
input = matrix3Default,
colHeader = colnames(input)
)
observeEvent(input$modify, {
showModal(modalDialog(rv$mat3))
})
output$table3 <- renderTable(
{
if (isTruthy(input$modify)) {
req(input$matrix3)
df <- input$matrix3
rv$mat3 <- matrix3Input("matrix3", df)
colnames(df) <- paste("Series", 1:ncol(df))
rownames(df) <- matrix3DefaultRownames
rv$input <- df
} else {
df <- matrix3Default
colnames(df) <- paste("Series", 1:ncol(df))
rownames(df) <- matrix3DefaultRownames
}
df[3:4] <- sprintf('%.2f%%', df[3:4])
#If you don't want to hardcode 3rd and 4th row and select only last2 rows.
#n <- nrow(df)
#df[c(n-1, n)] <- sprintf('%.2f%%', df[c(n-1, n)])
df
},
rownames = TRUE,
colnames = TRUE
)
}
shinyApp(ui, server)
@Ronak 的回答很好,但它改变了 table 的值。我宁愿使用按列选项 render
,它允许在不更改值的情况下更改值的 显示。
library(DT)
dat <- data.frame(
x = c(
1.2,
24.3,
0,
0.999
),
y = c(
12.8,
34.7,
0.1,
0.05
)
)
js <- c(
"function(data, type, row, meta){",
" var rowindex = meta.row;",
" if(type === 'display'){",
" if(rowindex <= 1){",
" return data.toFixed(0);",
" }else{",
" return (100*data).toFixed(2) + '%';",
" }",
" }",
" return data;",
"}"
)
datatable(
dat,
options = list(
columnDefs = list(
list(targets = c(1, 2), render = JS(js))
)
)
)
在 运行 以下 MWE 代码时呈现的 4 行 table 中,我希望前两行中的值不带小数,最后两行中的值要呈现的 2 行小数到百分之一和一个 % 符号。如最底部的图像所示,在第一次调用时的默认视图的情况下。此格式适用于首次调用应用程序和修改应用程序时呈现的默认 table(adding/deleting 行)。
有没有有效的方法来做到这一点?也许,如果可能的话,不添加功能(将其嵌入下面的 output$table3 <- renderTable(..
部分)?
MWE 代码:
library(shiny)
library(shinyMatrix)
library(magrittr)
# Default matrix for initializing
matrix3DefaultRownames <- c("A", "B", "C", "D")
matrix3Default <- data.frame('Series 1' = c(1, 24, 0, 100), row.names = matrix3DefaultRownames) %>% as.matrix()
matrix3Input <- function(inputId, matrix3Default) {
matrixInput(
inputId = inputId,
label = "Input terms:",
value = matrix3Default,
rows = list(extend = FALSE, names = TRUE),
cols = list(extend = TRUE, names = TRUE, editableNames = FALSE, delete = TRUE),
class = "numeric"
)
}
ui <- fluidPage(titlePanel("Inputs"), fluidRow(actionButton("modify", "Modify"), tableOutput("table3")))
server <- function(input, output, session) {
rv <- reactiveValues(
mat3 = matrix3Input("matrix3", matrix3Default),
input = matrix3Default,
colHeader = colnames(input)
)
observeEvent(input$modify, {
showModal(modalDialog(rv$mat3))
})
output$table3 <- renderTable(
{
if (isTruthy(input$modify)) {
req(input$matrix3)
df <- input$matrix3
rv$mat3 <- matrix3Input("matrix3", df)
colnames(df) <- paste("Series", 1:ncol(df))
rownames(df) <- matrix3DefaultRownames
rv$input <- df
} else {
df <- matrix3Default
colnames(df) <- paste("Series", 1:ncol(df))
rownames(df) <- matrix3DefaultRownames
}
df
},
rownames = TRUE,
colnames = TRUE
)
}
shinyApp(ui, server)
您可以使用 sprintf
-
library(shiny)
library(shinyMatrix)
library(magrittr)
# Default matrix for initializing
matrix3DefaultRownames <- c("A", "B", "C", "D")
matrix3Default <- data.frame('Series 1' = c(1, 24, 0, 100), row.names = matrix3DefaultRownames) %>% as.matrix()
matrix3Input <- function(inputId, matrix3Default) {
matrixInput(
inputId = inputId,
label = "Input terms:",
value = matrix3Default,
rows = list(extend = FALSE, names = TRUE),
cols = list(extend = TRUE, names = TRUE, editableNames = FALSE, delete = TRUE),
class = "numeric"
)
}
ui <- fluidPage(titlePanel("Inputs"), fluidRow(actionButton("modify", "Modify"), tableOutput("table3")))
server <- function(input, output, session) {
rv <- reactiveValues(
mat3 = matrix3Input("matrix3", matrix3Default),
input = matrix3Default,
colHeader = colnames(input)
)
observeEvent(input$modify, {
showModal(modalDialog(rv$mat3))
})
output$table3 <- renderTable(
{
if (isTruthy(input$modify)) {
req(input$matrix3)
df <- input$matrix3
rv$mat3 <- matrix3Input("matrix3", df)
colnames(df) <- paste("Series", 1:ncol(df))
rownames(df) <- matrix3DefaultRownames
rv$input <- df
} else {
df <- matrix3Default
colnames(df) <- paste("Series", 1:ncol(df))
rownames(df) <- matrix3DefaultRownames
}
df[3:4] <- sprintf('%.2f%%', df[3:4])
#If you don't want to hardcode 3rd and 4th row and select only last2 rows.
#n <- nrow(df)
#df[c(n-1, n)] <- sprintf('%.2f%%', df[c(n-1, n)])
df
},
rownames = TRUE,
colnames = TRUE
)
}
shinyApp(ui, server)
@Ronak 的回答很好,但它改变了 table 的值。我宁愿使用按列选项 render
,它允许在不更改值的情况下更改值的 显示。
library(DT)
dat <- data.frame(
x = c(
1.2,
24.3,
0,
0.999
),
y = c(
12.8,
34.7,
0.1,
0.05
)
)
js <- c(
"function(data, type, row, meta){",
" var rowindex = meta.row;",
" if(type === 'display'){",
" if(rowindex <= 1){",
" return data.toFixed(0);",
" }else{",
" return (100*data).toFixed(2) + '%';",
" }",
" }",
" return data;",
"}"
)
datatable(
dat,
options = list(
columnDefs = list(
list(targets = c(1, 2), render = JS(js))
)
)
)