我正在尝试创建一个侧边栏,用于输出数据表的列和每列中唯一值的数量。下面的代码适用于名称,但是当涉及到唯一值时,我只能在列表变量为unlist()ed时显示它。我找不到任何关于获取textOutput或等效的文章来处理多行的列表变量。
library(shiny)
data(mtcars)
if (interactive()) {
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
fluidRow(
column(6, checkboxGroupInput("dsnamesGrp","Variable name")),
column(6, uiOutput("dsordsGrp"), inline= FALSE)
)
),
mainPanel(
dataTableOutput('contents'))
)
)
server <- function(input, output, session) {
output$contents <- renderDataTable({mtcars})
dsnames <- list()
dsnames <- names(mtcars)
cb_options <- list()
cb_options[dsnames] <- dsnames
updateCheckboxGroupInput(session, "dsnamesGrp",
label = "Column name",
choices = cb_options,
selected = "")
ord_values <- list()
ord_values <- lapply(mtcars, function(x)length(unique(x)))
output$dsordsGrp <- renderText({unlist(ord_values)})
}
}
shinyApp(ui, server)
答案 0 :(得分:0)
我们可以使用lengths
unique
元素的list
ord_values <- lengths(lapply(mtcars, unique))
output$dsordsGrp <- renderText({ord_values})
-full code
library(shiny)
data(mtcars)
if (interactive()) {
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
fluidRow(
column(6, checkboxGroupInput("dsnamesGrp","Variable name")),
column(6, htmlOutput("dsordsGrp"), inline= FALSE)
)
),
mainPanel(
dataTableOutput('contents'))
)
)
server <- function(input, output, session) {
output$contents <- renderDataTable({mtcars})
dsnames <- names(mtcars)
cb_options <- list()
cb_options[dsnames] <- dsnames
updateCheckboxGroupInput(session, "dsnamesGrp",
label = "Column name",
choices = cb_options,
selected = "")
output$dsordsGrp <- renderUI({
HTML(paste(lengths(lapply(mtcars, unique)), collapse="<br/>"))
})
}
}
shinyApp(ui, server)
或者,如果我们使用与OP中相同的代码,而不是lapply
(始终返回list
输出),请使用返回sapply
的{{1}},因为默认参数为vector
,并使用simplify = TRUE
simplify2array
编辑:将ord_values <- sapply(mtcars, function(x)length(unique(x)))
output$dsordsGrp <- renderText({ord_values})
更改为renderText