Избегайте округления слайдера - PullRequest
1 голос
/ 27 января 2020

У меня проблемы с sliderInput, округляющим мой параметр начального значения, когда диапазон min / max большой. Как я могу предотвратить округление sliderInput моего параметра начального значения в случаях, подобных примеру ниже?

library(shiny)

ui <- fluidPage(
    sliderInput(
      inputId = "test",
      label = "A Nice Label",
      min = 2.52,
      max = 45734.68,
      value = 30982.63, # auto rounded to nearest integer in application, which I do not want it to do.
      round = FALSE # tried this argument, no dice.
    ),
    verbatimTextOutput(
      "value"
    )
  )

## SERVER PROCESSING DEFINITION
# this section defines how data is processed in response to manipulations in the ui
server <- function(input, output, session) {

  output$value <- renderText({
    input$test
  }) 

}

shinyApp(ui, server)

1 Ответ

1 голос
/ 27 января 2020

Вам необходимо указать аргумент step = для произвольного увеличения точности. В документации сказано, что «heuristi c используется» для определения размера шага по умолчанию, что приводит к наблюдаемому вами округлению. Смотрите эту обновленную версию:

library(shiny)

ui <- fluidPage(
  fluidPage(
    sliderInput(
      inputId = "test",
      label = "A Nice Label",
      min = 2.52,
      max = 45734.68,
      step = 0.01,      # the smallest level of precision in your args
      value = 30982.63, # no longer rounded
      round = FALSE     # this is the default
    ),
    verbatimTextOutput(
      "value"
    )
  )
)

## SERVER PROCESSING DEFINITION
# this section defines how data is processed in response to manipulations in the ui
server <- function(input, output, session) {

  output$value <- renderText({
    sprintf("%5.6f", input$test)       # format text to show precision
  }) 

}

shinyApp(ui, server)

Если вы покопаетесь в sliderInput, вы найдете следующее определение для shiny:::findStepSize:

function (min, max, step) 
{
  if (!is.null(step)) 
    return(step)
  range <- max - min
  if (range < 2 || hasDecimals(min) || hasDecimals(max)) {
    pretty_steps <- pretty(c(min, max), n = 100)
    n_steps <- length(pretty_steps) - 1
    signif(digits = 10, (max(pretty_steps) - min(pretty_steps))/n_steps)
  }
  else {
    1
  }
}

Итак, вы можете видеть, что он пытается сделать около 100 шагов между вашими минимальными и максимальными значениями, поэтому они автоматически округляются до целых (или даже больших шагов).

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