闪亮 - 以特定(非字母)顺序显示选择输入的选项

时间:2016-04-14 18:40:36

标签: r string shiny

我正在尝试使用用户将上传的文件中的列中的唯一值填充selectInput的下拉菜单。但问题是我想以某种非字母顺序显示选项,所以我不能只使用

updateSelectInput(....., choices = sort(unique(dataframe$column)))

四种可能的选择是:经济,高端经济,商业和第一。我想在数据框中出现时按照这样的顺序显示它们。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我用@Symbolix中的提示修复了问题。我首先创建了一个因素:

cabin <- factor(dataframe$column, levels = c("Economy", "Premium Econ",  "Business", "First"))

updateSelectInput,我有

...., choices = levels(factor(cabin))

再次调用factor会删除为数据集中不存在的级别生成的NA。

答案 1 :(得分:1)

如果您提到的4个选项集可以硬编码到您的应用中,那么您可以使用intersect来完成此操作。假设您将用户上传的文件内容放入名为d1的data.frame中,感兴趣的列为Class。通过将完整的选项集与数据中的唯一级别集相交来获取选项集。

ui.R

library(shiny)
shinyUI(fluidPage(
  titlePanel("SelectInput using ordered unique choices from a column"),
  sidebarLayout(
    sidebarPanel(fileInput(inputId = "SampleFile", label = "Upload a csv")),
    mainPanel(
      uiOutput("Drop1"),
      uiOutput("Drop2"),
      textOutput(outputId = "outCLASS1"),
      textOutput(outputId = "outCLASS2")
    )
  )
))

server.R

library(shiny)
shinyServer(function(input, output) {  

  d1 = reactive({
    if(is.null(input$SampleFile)){return(NULL)
    } else {d1 = read.csv(input$SampleFile$datapath)
    return(d1)} })

  AllOptions = c("economy", "premium economy", "business", "first")

  OptionSet1 = reactive({intersect(AllOptions, levels(d1()$Class)) })
  output$Drop1 = renderUI({ selectizeInput(inputId = "CLASS1", label = "Pick a class", choices = OptionSet1())})

  OptionSet2 = reactive({intersect(AllOptions, levels(d1()$Category2)) })
  output$Drop2 = renderUI({ selectizeInput(inputId = "CLASS2", label = "Pick a class", choices = OptionSet2())})

  output$outCLASS1 = reactive({input$CLASS1})
  output$outCLASS2 = reactive({input$CLASS2})

})