3

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

4

2 回答 2

2

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)
 
于 2020-08-07T05:19:12.787 回答
1

这可能与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))
}
于 2020-08-07T05:11:38.510 回答