删除Shiny中verbatimTextOutput中的删节摘要和索引值

时间:2018-01-27 05:08:01

标签: r shiny

我在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)

谢谢!

1 个答案:

答案 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
...