【问题标题】:Filtered data inside sliderInput() in shiny?闪亮的sliderInput()内的过滤数据?
【发布时间】:2018-12-02 00:37:06
【问题描述】:

我有一个 sliderInput(),我想根据用户输入来更改它的最大值。我正在尝试创建一个 wordcloud 并且 wordcloud 的代码正在运行,只是我的滑块需要调整。所以我的数据集看起来像这样:

document   term    count
1          code    1
1          help    28
1          stupid  4
1          shock   7
2          fire    2
2          fly     9
2          money   1
2          free    3
.          .       .
.          .       .
20

我想要的是我在 sliderInput() 函数中的最大值应该自动设置为所选文档的最高计数。因此用户可以在不同的文档“1”、“2”、直到“20”之间进行选择。根据选择,最大计数应分配给 sliderInput() 的最大值。在我的示例中:如果选择文档 1 -> 最大值 = 28。如果选择文档 2 -> 最大值 = 9。我有一个过滤函数,我在 server.R 中使用。如果我可以在 ui.R 中使用这个函数,我的问题就解决了,但不允许使用来自服务器内部 ui 的函数。我该如何解决这个问题?

代码ui.R:

        # Select document
        box(
          title = "Document Control",
          status = "primary",
          solidHeader = TRUE,
          width = 4,
          selectInput("doc", label="Select Document", choices = c(1:20), selected = 1)
        ),

        # Slider
        box(
          title = "Frequency Control",
          status = "primary",
          solidHeader = TRUE,
          width = 4,
          height = 142,
          sliderInput("minFreq", label = "Minimum Frequency", min = 1, max = ... , value = 15)
        ),

            box(
              title = "Number Control",
              status = "primary",
              solidHeader = TRUE,
              width = 4,
              height = 142,
              sliderInput("maxNum", label = "Maximum Number of Words", min = 1, max = 400, value = 150)

            ),

服务器代码:

  filtered <- reactive({
    Wcloud.Data.filtered <- Wcloud.Data %>%
      filter(document == input$doc)
  }) 

  output$plotWcloud <- renderPlot({

    wordcloud(words = filtered()$term, freq = filtered()$count, 
              min.freq = input$minFreq, max.words = input$maxNum, random.order=FALSE, 
              rot.per=0.35, colors=brewer.pal(8, "Dark2"))

  })

【问题讨论】:

    标签: r filter shiny filtering word-cloud


    【解决方案1】:

    sliderInput在服务器中创建的 函数,带有renderUI。 每次重新加载应用程序时,都会创建一个新数据集,并且滑块会更新 min/max/ 并采用数据的 5 值。

    library(shiny)
    
    ui <- fluidPage(
        uiOutput("slider")
    )
    
    server <- function(input, output) {
      output$slider <- renderUI({
        data = round(runif(10, 1, 100),2)
        sliderInput("sliderInp", label = "Select a value", min = min(data), max = max(data), value = data[5])
      })
    }
    
    shinyApp(ui, server)
    

    在您的示例中实施将导致:

    用户界面:

    # Select document
    box(
      title = "Document Control",
      status = "primary",
      solidHeader = TRUE,
      width = 4,
      selectInput("doc", label="Select Document", choices = c(1:20), selected = 1)
    ),
    
    # Slider
    box(
      title = "Frequency Control",
      status = "primary",
      solidHeader = TRUE,
      width = 4,
      height = 142,
      uiOutput("slider")
    ),
    

    服务器:

    filtered <- reactive({
      Wcloud.Data.filtered <- Wcloud.Data %>%
        filter(document == input$doc)
    }) 
    
    output$slider <- renderUI({
      sliderInput("minFreq", label = "Minimum Frequency", min = min(filtered()), max = max(filtered()), value = 15)
    })
    
    output$plotWcloud <- renderPlot({
      wordcloud(words = filtered()$term, freq = filtered()$count, 
                min.freq = input$minFreq, max.words = input$maxNum, random.order=FALSE, 
                rot.per=0.35, colors=brewer.pal(8, "Dark2"))
    })
    

    【讨论】:

    • 感谢您的想法。当滑块位于 ui.R 内时,它们是解决方案吗?我构建了一个非常大的仪表板,所以它必须在 ui.R 中。或者我怎样才能在我的代码中实现你的想法?不太理解你的建议
    • 您也可以使用updateSliderInput,但我更喜欢在服务器中创建滑块。在示例中,您可以看到在 ui 中现在有一个 uiOutput 而不是 sliderInput。在服务器中有一个renderUI 函数,它将根据数据创建具有最小值/最大值的滑块。我将编辑我的答案,使其适合您的示例。
    • 完美男人!你是一个精灵。非常感谢。我修复了一个错误。而不是min(filtered()),我们必须使用min(filtered()$count) 以及最大值。现在它的工作!非常感谢
    • 是否也可以为最大数量滑块执行此操作?我用相同的代码尝试过,但问题是术语是字符而不是单词。尝试使用 count() 函数但无法处理。
    • 最大数字滑块是多少? sliderInput 的最小值和最大值已经动态创建。你的意思是max.words = input$maxNum
    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 2019-07-04
    • 2020-08-11
    • 1970-01-01
    • 2020-04-06
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多