我尝试将缩放比例为noUiSliderInput
的日志与线性比例为numericInput
的链接而不创建永恒的更新循环。
通常,我会这样停止更新行:
input$Histoslider != log10(input$Threshold_box)
这会产生一些小数点问题,我似乎无法正确解决。 主要问题似乎是noUiSliderInput始终将其输出舍入为两位小数,从而导致舍入为来回转换为10 ^和log10的舍入问题
详细说明:
我有一个应用程序,用户可以通过以下两种方式设置阈值过滤器:
1:在numericInput
中输入未转换的数字
或
2:通过更改垂直noUiSliderInput
上的条形。
noUiSliderInput
表示为log10数字,因为它与log10比例尺的数据图对齐。因此,如果绘图从10 ^ -1到10 ^ 4.5,则滑块的值从-1到4.5
numericInput
和noUiSliderInputare
已链接,因此更改一个应更新另一个。
使用小数创建了很多困难。 numericInput
必须在应用程序中限制为两位小数。为此,我再次添加了一些转换,舍入和转换以获取匹配的数字。
我可以使它适用于普通的sliderInput
,但是不管怎样它们noUiSliderInput
都无法使用,尽管它们应该吐出相同格式的数据。
我必须坚持使用noUiSliderInput
的原因是因为在图的x和y轴上都需要一个滑块。
尝试在numericInput中键入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)