【问题标题】:Shiny: select variables to tableShiny:选择要表的变量
【发布时间】:2017-11-23 12:36:55
【问题描述】:

我已经有一个问题要打开这个话题。好吧,我正在尝试做一个与 Shiny 类似的应用程序:动态数据框构造; renderUI,观察,reactiveValues。我想在开头添加一个新类别,它将从表中选择变量。我不能将变量与应用程序中的其他元素结合起来。有人可以向我解释我做错了什么吗? 正如您在图形程序上看到的那样,它不能很好地工作。 下面是一个脚本

#rm(list = ls())
library(shiny)

data <- data.frame(Category1 = rep(letters[1:3],each=15),
                   Info = paste("Text info",1:45),
                   Category2 = sample(letters[15:20],45,replace=T),
                   Size = sample(1:100, 45),
                   MoreStuff = paste("More Stuff",1:45))

ui <- fluidPage(

  titlePanel("Test Explorer"),
  sidebarLayout(
    sidebarPanel(
      selectizeInput("show_vars", "Columns to show:",
                     choices = colnames(data), multiple = TRUE,
                     selected = c("Category1","Info","Category2")),
      uiOutput("category1"),
      uiOutput("category2"),
      uiOutput("sizeslider")
    ),
    mainPanel(
      tableOutput("table")
    )
  )
)

server <- function(input, output,session) {


  data2 <- reactive({
    req(input$table)
    if(input$table == "All"){
      return(data)
    } 
    data[,names(data) %in% input$show_vars]
  })


  output$category1 <- renderUI({
    selectizeInput('cat1', 'Choose Cat 1', choices = c("All",sort(as.character(unique(data$Category1)))),selected = "All")
  })

  df_subset <- eventReactive(input$cat1,{
    if(input$cat1=="All") {df_subset <- data}
    else{df_subset <- data[data$Category1 == input$cat1,]}
  })

  df_subset1 <- reactive({
    if(is.null(input$cat2)){df_subset()} else {df_subset()[df_subset()$Category2 %in% input$cat2,]}
  })

  output$category2 <- renderUI({
    selectizeInput('cat2', 'Choose Cat 2 (optional):', choices = sort(as.character(unique(df_subset()$Category2))), multiple = TRUE,options=NULL)
  })

  output$sizeslider <- renderUI({
    sliderInput("size", label = "Size Range", min=min(df_subset1()$Size), max=max(df_subset1()$Size), value = c(min(df_subset1()$Size),max(df_subset1()$Size)))
  })

  df_subset2 <- reactive({
    if(is.null(input$size)){df_subset1()} else {df_subset1()[df_subset1()$Size >= input$size[1] & df_subset1()$Size <= input$size[2],]}
  })

  output$table <- renderTable({
    df_subset2()
  })
}

shinyApp(ui, server)

【问题讨论】:

  • 问题是不管你选择什么列都显示?
  • 我希望能够选择显示哪些列。在示例中也是如此,但您可以看到仍然显示所有列。

标签: r shiny


【解决方案1】:

您不需要data2,因为您没有使用它,而是可以使用相同的条件来过滤显示数据框的任何位置的 %in% 列。

#rm(list = ls())
library(shiny)

data <- data.frame(Category1 = rep(letters[1:3],each=15),
                   Info = paste("Text info",1:45),
                   Category2 = sample(letters[15:20],45,replace=T),
                   Size = sample(1:100, 45),
                   MoreStuff = paste("More Stuff",1:45))

ui <- fluidPage(

  titlePanel("Test Explorer"),
  sidebarLayout(
    sidebarPanel(
      selectizeInput("show_vars", "Columns to show:",
                     choices = colnames(data), multiple = TRUE,
                     selected = c("Category1","Info","Category2")),
      uiOutput("category1"),
      uiOutput("category2"),
      uiOutput("sizeslider")
    ),
    mainPanel(
      tableOutput("table")
    )
  )
)

server <- function(input, output,session) {





  output$category1 <- renderUI({
    selectizeInput('cat1', 'Choose Cat 1', choices = c("All",sort(as.character(unique(data$Category1)))),selected = "All")
  })

  df_subset <- eventReactive(input$cat1,{
    if(input$cat1=="All") {df_subset <- data}
    else{df_subset <- data[data$Category1 == input$cat1,names(data) %in% input$show_vars]}
  })

  df_subset1 <- reactive({
    if(is.null(input$cat2)){df_subset()} else {df_subset()[df_subset()$Category2 %in% input$cat2,names(data) %in% input$show_vars]}
  })

  output$category2 <- renderUI({
    selectizeInput('cat2', 'Choose Cat 2 (optional):', choices = sort(as.character(unique(df_subset()$Category2))), multiple = TRUE,options=NULL)
  })

  output$sizeslider <- renderUI({
    sliderInput("size", label = "Size Range", min=min(df_subset1()$Size), max=max(df_subset1()$Size), value = c(min(df_subset1()$Size),max(df_subset1()$Size)))
  })

  df_subset2 <- reactive({
    if(is.null(input$size)){df_subset1()} else {df_subset1()[df_subset1()$Size >= input$size[1] & df_subset1()$Size <= input$size[2],names(data) %in% input$show_vars]}
  })

  output$table <- renderTable({
    df_subset2()
  })
}

shinyApp(ui, server)

【讨论】:

  • 这不是一个好的解决方案。因为更改其他变量(类别、大小滑块)会显示很多警告和错误。
  • @Kim 当您没有数字列但有数字滑块时,它会显示警告。但这不正是您希望允许某人选择该列的结果吗?
  • 之前没有出现警告或错误,最常见的消息是:未定义的列已选择。
  • 当该列不会被选中时,使用数字字段的目的是什么?它有什么帮助?
  • 是否可以在未选中此列时隐藏数字字段,反之亦然?
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2012-01-28
相关资源
最近更新 更多