sliderTextInput отображает неверные значения? - PullRequest
3 голосов
/ 07 августа 2020

Я пытаюсь вывести определенное число на основе значения из sliderTextInput, но по какой-то причине кажется, что оно не отображает правильное значение при изменении ползунка. Мой список вариантов для sliderTextInput: («0», «1», «2», «> 2»), и для каждого из этих значений он должен отображать текстовое значение (0, 25, 50, 75 ), но значение 0 обычно никогда не отображается, и кажется, что значения сдвинуты на одно значение. Вот воспроизводимый пример проблемы:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  sliderTextInput("slider1", label = "What is your Score?", 
                  choices = c("0","1", "2", ">2"), selected = "0"),

    textOutput("score")
)

server <- function(input, output, session) {
  output$score <- renderText(switch(input$slider1,
                                  "0"  = 0,
                                  "1"  = 25,
                                  "2"  = 50,
                                  ">2" = 75))
}
shinyApp(ui, server)

Я подумал, что это может быть потому, что он не может интерпретировать сочетание строк и чисел (например, «> 2» против «2») или значение 0 можно интерпретировать по-разному, но их изменение не повлияло. Единственный способ заставить его работать, это если я изменил каждое входное значение на чистую строку (например, «Ноль», «Один», «Два», «> Два»). Однако, не заключая числа в кавычки, заставляет оценивать как символ, а не как число? Или я полностью упускаю ошибку?

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

switch требует точного совпадения, но если вы выведете:

output$score <- renderText(class(input$slider1))

, вы увидите, что 3 первых варианта возвращают integer, а последний возвращает character.

Применение input$slider1 к персонажу работает:

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
  sliderTextInput("slider1", label = "What is your Score?", 
                  choices = c("0","1", "2", ">2"), selected = "0"),
  
  textOutput("score")
)

server <- function(input, output, session) {
  output$score <- renderText(switch(as.character(input$slider1),
                                    "0"  = 0,
                                    "1"  = 25,
                                    "2"  = 50,
                                    ">2" = 75))
}
shinyApp(ui, server)
 
1 голос
/ 07 августа 2020

Это может иметь какое-то отношение к тому, как работает switch, например, на его странице справки

, если есть совпадение, то этот элемент оценивается, если он не отсутствует, и в этом случае оценивается следующий неотсутствующий элемент, поэтому, например, switch ("cc", a = 1, cc =, cd =, d = 2) оценивается как 2.

. ... особенно в сочетании с sliderTextInput - я заметил, что если вы просто определите output$score <- renderText(input$slider1), он ничего не будет отображать, когда ползунок установлен в 0. Так что я не совсем уверен, что происходит.

Один из способов получить желаемый результат (хотя и не такой красивый, как switch) - использовать dplyr::case_when, например,

server <- function(input, output, session) {
    output$score <- renderText(
        dplyr::case_when(
            input$slider1 == "0" ~ 0,
            input$slider1 == "1" ~ 25,
            input$slider1 == "2" ~ 50,
            input$slider1 == ">2" ~ 75))
}
...