【问题标题】:R Shiny dynamic list variable to multiple rowsR闪亮的动态列表变量到多行
【发布时间】:2017-12-30 04:35:13
【问题描述】:

我正在尝试创建一个侧边栏,用于输出数据表的列以及每列中唯​​一值的数量。下面的代码适用于名称,但是当涉及到唯一值时,如果列表变量是 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)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我们可以在unique 元素上使用lengths list

    ord_values <- lengths(lapply(mtcars, unique))
    output$dsordsGrp <- renderText({ord_values})
    

    -完整代码

    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 返回 vector,因为默认参数是 simplify = TRUE 并且它使用simplify2array

    ord_values <- sapply(mtcars, function(x)length(unique(x)))
    output$dsordsGrp <- renderText({ord_values})
    

    编辑:将 renderText 更改为 renderUI

    【讨论】:

    • 您修改的 lapply 和 sapply 形式的长度都会产生与我现在得到的相同的输出。我仍然将第二列视为一串条目(25 3 27 22 22 29 30 2 2 3 6),而不是分成行。您知道如何将数据输出为与名称列对齐的单独行吗?
    • @terrangreen 我以为你的问题是如何删除 unlist 部分?如果你想把它分成几行,使用cat
    • 好的,cat 在控制台中得到了想要的结果。我仍然需要让列表变量(或向量,如果这样更好的话)显示在 ui 中的多行中。
    • @terrangreen 你可以使用column(6, htmlOutput("dsordsGrp"), inline= FALSE)output$dsordsGrp &lt;- renderUI({ HTML(paste(lengths(lapply(mtcars, unique)), collapse="&lt;br/&gt;")) })
    • 太棒了,谢谢。您是否有机会让行与 checkboxGroupInput 对齐?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多