sliderTextInput 显示不正确的值?

sliderTextInput displays incorrect values?

我试图根据 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 可能有不同的解释,但更改这些没有效果。我能够让它工作的唯一方法是将每个输入值更改为清晰的字符串(例如“零”、“一”、“二”、“>二”)。但是,用引号将数字括起来不会强制评估为字符,而不是数字吗?还是我完全遗漏了错误?

这可能与 switch 的工作方式有关,例如,从其帮助页面,

if there is a match then that element is evaluated unless it is missing, in which case the next non-missing element is evaluated, so for example switch("cc", a = 1, cc =, cd =, d = 2) evaluates to 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))
}

switch要求完全匹配,但是如果输出:

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

你会看到 3 个第一个选择 return integer 而最后一个 returns 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)