проблема с выводом noUiSliderInput, имеющим только 2 десятичных знака - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь связать масштабированный журнал noUiSliderInput с линейным масштабированным numericInput без создания вечного цикла обновления.Обычно я бы остановил строки обновления следующим образом:

input$Histoslider != log10(input$Threshold_box)

Это создало некоторые проблемы с десятичными числами, которые я не могу исправить должным образом.Основная проблема заключается в том, что noUiSliderInput всегда округляет свой вывод до 2 десятичных знаков, вызывая проблему округления для преобразования в 10 ^ и log10 туда и обратно

Подробное описание:

У меня есть приложение, в котором пользователь может установить пороговые фильтры двумя способами:

1: введите число в numericInput в не преобразованных числах

или

2: изменяя планку по вертикали noUiSliderInput.

Однако noUiSliderInput выражается в виде числа log10, поскольку оно выровнено с графиком данных в масштабе log10.поэтому, если график начинается с 10 ^ -1 до 10 ^ 4.5, у ползунка есть значения от -1 до 4.5

Связанные numericInput и noUiSliderInputare, поэтому изменение одного должно обновить другое.Это создало много трудностей с десятичными числами.numericInput должно быть ограничено в приложении до 2 десятичных знаков.Поэтому для этого я снова добавляю некоторые преобразования, округления и преобразования, чтобы получить совпадающие числа.

Я могу заставить его работать для нормального sliderInput, но как-то не для noUiSliderInput, даже если они должны выплевывать тот же формат данных.

Причина, по которой я должен придерживаться noUiSliderInput, заключается в том, что мне нужен ползунок по осям x и y графика.

Попробуйте ввести 1256 в числовом входе, чтобы увидеть пример проблемы

Приложение:

# install.packages("devtools")
devtools::install_github("dreamRs/shinyWidgets")
library(shiny)
library(shinyWidgets)

# function to see how many decimal places we need
decimalplaces <- function(x) {
  if ((x %% 1) != 0) {
    deci <- nchar(strsplit(sub('0+$', '', as.character(x)), ".", fixed=TRUE)[[1]][[2]])
    if(deci >2) { deci <- 2}
    return(deci)
  } else {
    return(0)
  }
}

# starting values for the sliders
minval <- round(-1, digits = 6)
maxval <- round(4.5, digits = 6)

ui <- fluidPage(
  tags$br(),
  fluidRow(
    column(3,
  div(numericInput("Threshold_box", "Normal value: ", min = 0, max = 100, value = 1, step=0.01), style = "display:inline-block") ),
  column(2, 
         # div(sliderInput( inputId = "Histoslider", label = NULL, min = minval, max = maxval, value = 0, step = 0.000001), style = 'display:inline-block; position:relative')
noUiSliderInput(inputId = "Histoslider", label = NULL, min = minval, max = maxval,  tooltips = FALSE, value = 0, step = 0.000001, direction = "rtl", orientation = "vertical", width = "100px", height = "276px")
   )))

server <- function(input, output, session) {
  #setting decimals to 6 as that seemed to work in the end for a normal sliderInput
  values <- reactiveValues( transformDecimal = 2)

observeEvent(input$Threshold_box, { 
    if(!is.na(input$Threshold_box)) { values$transformDecimal <- decimalplaces(input$Threshold_box)
    if(input$Histoslider != log10(input$Threshold_box)) { 
      newval <- log10(input$Threshold_box)
      # updateSliderInput(session, 'Histoslider', value = newval)
      updateNoUiSliderInput(session, 'Histoslider', value = newval)
     }}}, ignoreInit = T)


  observeEvent(input$Histoslider, { 
    ## next three lines are to get matching set between a 2 decimal numer and the log value
    sliderFull <- 10^input$Histoslider
    sliderRound <- round(sliderFull, digits = values$transformDecimal)
    sliderLog <- log10(sliderRound)

    updateSliderInput(session, 'Histoslider', value = sliderLog)
    if(sliderLog != log10(input$Threshold_box)) { 
      updateNumericInput(session, 'Threshold_box', value = round(10^sliderLog, digits = values$transformDecimal))
    }
  }, ignoreInit = T)
}

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