Отфильтрованные данные внутри sliderInput () блестят?

У меня есть 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. У меня есть отфильтрованная функция, которую я использую на сервере. Если бы я мог использовать эту функцию внутри ui.R, моя проблема была бы решена, но нельзя использовать функции из внутреннего пользовательского интерфейса сервера. Как я могу решить эту проблему?

Код 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"))

  })

person Belfort90    schedule 22.06.2018    source источник


Ответы (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)

Реализация в вашем примере приведет к:

ui:

# 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"))
})
person SeGa    schedule 22.06.2018
comment
спасибо за вашу идею. Это решение, когда слайдер находится внутри ui.R? Я создаю очень большую приборную панель, поэтому она должна находиться внутри ui.R. Или как я могу воплотить вашу идею в свой код? Не понимаю твоего предложения так хорошо - person Belfort90; 22.06.2018
comment
Вы также можете использовать updateSliderInput, но я предпочитаю создавать слайдер на сервере. В этом примере вы можете видеть, что вместо sliderInput в пользовательском интерфейсе теперь есть uiOutput. На сервере есть функция renderUI, которая создаст ползунок с минимальными / максимальными значениями на основе данных. Я отредактирую свой ответ, чтобы он соответствовал вашему примеру. - person SeGa; 22.06.2018
comment
Perfecccttt человек! Вы джинны. Большое тебе спасибо. Одну ошибку я исправил сам. Вместо min(filtered()) мы должны использовать min(filtered()$count), а также максимальное значение. Теперь он работает! Большое спасибо - person Belfort90; 22.06.2018
comment
Можно ли это сделать и для ползунка максимальных чисел? Я пробовал использовать тот же код, но проблема в том, что термин - это символы, а не слова. Пробовал использовать функцию count (), но не смог. - person Belfort90; 22.06.2018
comment
Какой ползунок максимальных чисел? Мин и макс sliderInput уже создаются динамически. Вы имеете в виду max.words = input$maxNum? - person SeGa; 22.06.2018
comment
Да max.words = input$maxNum. Могу ли я сделать это и для макс. Слов? на основе выбранных документов подсчитайте слова, относящиеся к этому документу, и поместите их также в ползунок max.words. Смотрите мой код. Я вставляю поле maxNum. - person Belfort90; 22.06.2018
comment
Да, вы можете использовать renderUI и uiOutput для любых блестящих входов. Та же процедура;) - person SeGa; 22.06.2018
comment
Да, я знаю, но в столбце теперь нет чисел, это слова (символы). Так как я могу их посчитать? - person Belfort90; 22.06.2018
comment
Ты джинн! Спасибо брат! работал отлично. Спасибо за вашу помощь, я очень признателен. - person Belfort90; 22.06.2018