【问题标题】:Shiny -- display the options of a select input in a specific (non-alphabetic) order闪亮——以特定(非字母)顺序显示选择输入的选项
【发布时间】:2016-08-06 11:54:26
【问题描述】:

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

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

四个可能的选项是:经济、高级经济、商务和头等舱。只要它们出现在数据框中,我就想按这样的顺序显示它们。

提前感谢您的帮助!

【问题讨论】:

  • 不确定,但你可以试试factor(c("economy", "premium economy", "business", "first"), levels = c("economy", "premium economy", "business", "first"))
  • 感谢您的回复。我试过choices = factor(unique(dataframe$Column), levels = c("Economy", "Premium economy", "Business", "First"), ordered = TRUE,但是在下拉菜单中,它只显示列中存在的级别的索引。
  • data.frame$Column 上设置因子级别,然后在下拉列表中使用choices = as.character(dataframe$Column)
  • @Symbolix 嗨。感谢您的回答。我尝试了您的方法并创建了一个名为cabin 的因子,具有四个级别。但是我仍然按照它们在数据集中出现的顺序得到它们,并且我还得到了不存在的级别的 NA。我通过使用choices = levels(factor(cabin)) 而不是as.character 解决了这个问题。但无论如何,感谢您提供有关使用因子的提示。不知道为什么我没有早点想到。
  • 很高兴我能帮上忙。如果您已经回答了自己的问题,则应将其添加为答案,然后接受/勾选您的答案(在 2 天限制之后),以便其他人知道它已解决。

标签: r string shiny


【解决方案1】:

我通过@Symbolix 的提示解决了这个问题。我首先创建了一个因子:

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

updateSelectInput,我有

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

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

【讨论】:

    【解决方案2】:

    如果您提到的 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")
        )
      )
    ))
    

    服务器.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})
    
    })
    

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 2018-08-02
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      相关资源
      最近更新 更多