Я знаю, sliderInput()
значения будут округлять в зависимости от размера шага слайдера.Однако существует ли элегантный способ сохранять значения в sliderInput()
с большей точностью, чем то, что отображается ?Решения, которые я придумала до сих пор, несовершенны и не видели никаких других актуальных SO-тем, когда я смотрел.
MWE:
library(shiny)
ui <- fluidPage(
sidebarPanel(
sliderInput("alpha", label = "Var 1", min = 0, max = 12, step = 1, value = 0),
actionButton("go", "Set to Mean")
),
mainPanel(
textOutput("alphaTrueVal"),
conditionalPanel("input.go !=0",
textOutput("alphaSliderVal")
)
)
)
server <- function(input, output, session){
# Gen some fake integer data with a non-integer mean
data <- eventReactive(input$go, {
x <- sample(0:12, 75, replace=T)
})
output$alphaTrueVal <- renderText({
paste0("Var's true mean: ", mean(data()))
})
output$alphaSliderVal <- renderText({
paste0("Var's slider val (when mean set): ", input$alpha)
})
# To update to mean
observeEvent(input$go, {
updateSliderInput(session, "alpha",
value=mean(data())
)
})
}
shinyApp(ui, server)
В идеале, ползунок может визуально отображать округленное целое число, но когда сервер запрашивает значение ползунка, оно соответствует среднему значению.Здесь это не так.
Два несовершенных решения:
- Настройте размер шага ползунка с помощью
updateSliderInput()
:
library(shiny)
ui <- fluidPage(
sidebarPanel(
sliderInput("alpha", label = "Var 1", min = 0, max = 12, step = 1, value = 0),
actionButton("go", "Set to Mean")
),
mainPanel(
textOutput("alphaTrueVal"),
conditionalPanel("input.go !=0",
textOutput("alphaSliderVal")
)
)
)
server <- function(input, output, session){
# Gen some fake data with a non-integer mean
data <- eventReactive(input$go, {
x <- sample(0:12, 75, replace=T)
})
output$alphaTrueVal <- renderText({
paste0("Var's true mean: ", mean(data()))
})
output$alphaSliderVal <- renderText({
paste0("Var's slider val (when mean set): ", input$alpha)
})
# "Solution" 1
observeEvent(input$go, {
updateSliderInput(session, "alpha",
step=0.00001, value=mean(data())
)
})
}
shinyApp(ui, server)
Но это оставляет ползунок очень тонким, когда пользователь взаимодействует с ним впоследствии.
shinyWidgets
'
sliderTextInput()
Вы не написали рабочий код, но, похоже, вы могли бы изменить начальный выбор sliderTextInput()
, вставив среднее значение с помощью updateSliderTextInput()
.Если начальные значения были:
choices = c=("0", "1", "2", "3", "4")
, а среднее было равно 2,3, вы вставили бы его в набор начальных вариантов выбора, отсортировали результирующий вектор как числовой и преобразовали его в символы перед передачей обратно.в updateSliderTextInput()
как:
choices = c=("0", "1", "2", "2.3", "3", "4")
Проблема, которую я вижу, состоит в том, что все точки будут равноудалены в расстоянии между ними, когда 2,3 не равноудалено от 2 и 3. (Имеет смысл, учитывая, как хранятся вещи, но не то, к чему я стремлюсь.)