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)
我试图根据 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)