Сохраненная и отображаемая точность с блестящими ползунками - PullRequest
0 голосов
/ 10 июля 2019

Я знаю, 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)

В идеале, ползунок может визуально отображать округленное целое число, но когда сервер запрашивает значение ползунка, оно соответствует среднему значению.Здесь это не так.

Два несовершенных решения:

  1. Настройте размер шага ползунка с помощью 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. (Имеет смысл, учитывая, как хранятся вещи, но не то, к чему я стремлюсь.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...