在ShinyApp中命名过滤数据变量的问题

时间:2018-12-26 07:38:13

标签: r datatable shiny radio-button dashboard

希望大家一切都好。我面临着ShinyApps的一个小问题。 我已附上我需要的图片。 我基本上是针对 mtcars 数据的 cyl 变量。如果我从中按 4 ,则要求过滤后的数据具有4个名称,其余变量的名称带有 4 个。 同样,如果我同时按 4和6 ,则需要过滤的数据,其中包含 cyl 的4和6,以及附加到变量其余部分的 4和6 名称。 所附图片将使事情更容易理解。 我也附上我的代码。 请指导我。预先捆绑感谢:)

enter image description here

data_table<-mtcars

library(shiny)
ui <- fluidPage(

checkboxGroupInput(inputId = "variables", label = "Choose number(s):",
           choices =c("4","6", "8"),
           selected = c("4")),


DT::dataTableOutput("distable"))



server <- function(input, output){

thedata <- reactive({

if(input$variables != '0'){
  data_table<-data_table[data_table$cyl %in% input$variables,]
}

# 
# if(input$variables == '4'){
#   names(data_table)[3:11]<-paste( "four","_" ,names(data_table)[3:11])
# }
# 
# if(input$variables == '6'){
#   names(data_table)[3:11]<-paste( "six","_" ,names(data_table)[3:11])
# }
# 
# if(input$variables == '8'){
#   names(data_table)[3:11]<-paste( "eight","_" ,names(data_table)[3:11])
# }
# 
# 


})


output$distable = DT::renderDataTable({

DT::datatable( filter = "top",  
             {   thedata() # Call reactive thedata()

                              })  

})
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

使用-

data_table<-mtcars
library(data.table)
repl <- list("4"="four","6"="six","8"="eight")

library(shiny)
ui <- fluidPage(

  checkboxGroupInput(inputId = "variables", label = "Choose number(s):",
                     choices =c("4","6", "8"),
                     selected = c("4")),


  DT::dataTableOutput("distable"))



server <- function(input, output){

  thedata <- reactive({

    if(input$variables != '0'){
      data_table<-data_table[data_table$cyl %in% input$variables,]
      colnames(data_table) <- gsub(paste( paste("_",sapply(repl, paste),sep=""),collapse="|"),"", colnames(data_table))
      cols <- colnames(data_table)
      suffix <- paste(paste("_", sapply(repl[input$variables],paste), sep=""),collapse="")
      setnames(data_table, old = cols[3:length(cols)], new = paste(cols[3:length(cols)], suffix, sep=""))

    }

    # 
    # if(input$variables == '4'){
    #   names(data_table)[3:11]<-paste( "four","_" ,names(data_table)[3:11])
    # }
    # 
    # if(input$variables == '6'){
    #   names(data_table)[3:11]<-paste( "six","_" ,names(data_table)[3:11])
    # }
    # 
    # if(input$variables == '8'){
    #   names(data_table)[3:11]<-paste( "eight","_" ,names(data_table)[3:11])
    # }
    # 
    # 


  })


  output$distable = DT::renderDataTable({

    DT::datatable( filter = "top",  
                   {   thedata() # Call reactive thedata()

                   })  

  })
}

shinyApp(ui = ui, server = server)

这将为您提供所需的后缀。对于此mtcars示例,cbind部分是不可能的,因为每个过滤器的行长都不同,但这将为您提供一个良好的开端。

说明

我们使用

repl <- list("4"="four","6"="six","8"="eight")

用于创建初始查询以将input$variables映射到要使用的后缀。

thedata函数中进行实际过滤之后,会发生以下情况-

colnames(data_table) <- gsub(paste( paste("_",sapply(repl, paste),sep=""),collapse="|"),"", colnames(data_table))

这是用于重置您可能已经完成的所有先前的重命名。因此它将替换后缀_four_six等,以便您可以重新开始。

cols <- colnames(data_table)
  suffix <- paste(paste("_", sapply(repl[input$variables],paste), sep=""),collapse="")

suffix准备后缀,该后缀取决于_four的选择数量,可以对应_four_six

input$variables

此部分使用 setnames(data_table, old = cols[3:length(cols)], new = paste(cols[3:length(cols)], suffix, sep="")) 库中带有setnames的后缀进行最终替换,这有助于替换R data.table中列名的子集。