我在Shiny中使用verbatimTextOutput()和renderPrint()来总结和陈述字母因子数据集的唯一值。我想以干净的方式展示所有因素。
但是,当我执行数据摘要时,它只列出前六个因子/字母,然后列出状态(其他)。此外,当我尝试列出数据的唯一字母时,它会在每个字母前面添加一个索引。我该如何解决这两个问题?
我制作了一个MWE来说明问题:
# Load packages
library(shiny)
# Load data
data <- data.frame(letters = factor(sample(LETTERS, 200, replace=TRUE)))
# Define UI
ui <- fluidPage(
sidebarPanel(
radioButtons(inputId = "column", label = "Choose a summary column:", choices = colnames(data)),
radioButtons(inputId = "column2", label = "Choose a unique column:", choices = colnames(data))
),
mainPanel(
verbatimTextOutput("summary"),
verbatimTextOutput("unique")
)
)
# Define server logic
server <- function(input, output) {
output$summary <- renderPrint({
summary(data[input$column])
})
output$unique <- renderPrint({
unique(data[input$column2])
})
}
# Create Shiny object
shinyApp(ui = ui, server = server)
谢谢!
答案 0 :(得分:1)
您可以使用以下代码:
server <- function(input, output) {
output$summary <- renderPrint({
df <- as.data.frame(summary(data[[input$column]], maxsum = nlevels(data[[input$column]])))
`names<-`(df, input$column)
})
output$unique <- renderPrint({
cat(as.character(unique(data[[input$column2]])), sep="\n")
})
}
备选方案1
参数maxsum
表示因子级别的数量,应该在摘要的输出中显示
> summary(data[['letters']], maxsum = nlevels(data[['letters']]))
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
7 7 12 12 4 12 2 8 6 6 3 6 6 7 7 6 8 12 12 5 12 11 3 8 10 8
不幸的是,这会给你一个命名向量作为输出,它是水平打印而不是垂直打印。
备选方案2
如果将完整的data.frame传递给summary,它会为您提供一个很好的垂直结果列表。这里的问题是,如果data.frame有多列,并且您希望仅为其中一列提供摘要,则无效。
> summary(data, maxsum=nlevels(data[['letters']]))
letters
A: 7
B: 7
C:12
D:12
E: 4
...
<强>解决方案强>
此变通方法将为您提供一个很好的列表而不是水平输出:
> df <- as.data.frame(summary(data[['letters']], maxsum = nlevels(data[['letters']])))
> `names<-`(df, 'letters')
letters
A 7
B 7
C 12
D 12
...
以下将创建一个没有索引的垂直输出:
> cat(as.character(unique(data[['letters']])), sep="\n")
J
N
Q
Y
U
Z
...
字符按数据中出现的顺序显示。
<强>排序强>
如果要对它们进行排序,请使用sort()
:
> cat(sort(as.character(unique(data[['letters']]))), sep="\n")
A
B
C
D
...