Это то, что мне удалось достичь.Есть только одна проблема: 1000
отображается как 1000.000000000002
.Я не знаю, как с этим справиться.
library(shiny)
library(shinyWidgets)
library(shinyjs)
js <- paste(
"var slider = document.getElementById('noui').noUiSlider;",
"slider.updateOptions({",
" format: wNumb({",
" encoder: function(x){return Math.pow(10,x);}",
" })",
"});",
"slider.pips({",
" mode: 'range',",
" density: 2,",
" format: {",
" to: function(x){return '10^' + x;}",
" }",
"});",
sep = "\n"
)
ui <- fluidPage(
useShinyjs(),
tags$br(),
noUiSliderInput(
inputId = "noui", label = "Slider vertical:",
min = -2, max = 4, step = 1,
value = 0, margin = 100,
orientation = "vertical",
width = "300px", height = "300px"
),
verbatimTextOutput(outputId = "res")
)
server <- function(input, output, session) {
output$res <- renderPrint(input$noui)
observeEvent(input$noui, {
runjs(js)
}, once = TRUE)
}
shinyApp(ui, server)
РЕДАКТИРОВАТЬ
Я не нашел, как получить HTMLзначения в пипсах с помощью опции format
.Вот способ получить 10^x
с верхними индексами:
var pipsValues = $('.noUi-value');
pipsValues.each(function(){$(this).html('10<sup>'+$(this).attr('data-value')+'</sup>')});
То есть полный код JS:
js <- paste(
"var slider = document.getElementById('noui').noUiSlider;",
"slider.updateOptions({",
" format: wNumb({",
" encoder: function(x){return parseFloat(Math.pow(10,x).toPrecision(2));}",
" })",
"});",
"slider.pips({",
" mode: 'range',",
" density: 2",
"});",
"var pipsValues = $('.noUi-value');",
"pipsValues.each(function(){$(this).html('10<sup>'+$(this).attr('data-value')+'</sup>')});",
sep = "\n"
)
РЕДАКТИРОВАТЬ 2
Вотприложение, которое имеет дело со случаем, когда min
, max
и value
являются реактивными значениями.Идея состоит в том, чтобы избежать renderUI
: приложение запускается с начального ползунка, и эти три значения обновляются Javascript с помощью метода updateOptions
.
library(shiny)
library(shinyWidgets)
library(shinyjs)
js <- function(Min, Max, Start){
sprintf(paste(
"var slider = document.getElementById('noui').noUiSlider;",
"slider.updateOptions({",
" start: %s,",
" range: {min: %s, max: %s},",
" format: wNumb({",
" encoder: function(x){return parseFloat(Math.pow(10,x).toPrecision(2));}",
" })",
"});",
"var pipsValues = $('.noUi-value');",
"pipsValues.each(function(){$(this).html('10<sup>'+$(this).attr('data-value')+'</sup>')});",
sep = "\n"
), Start, Min, Max)
}
ui <- fluidPage(
useShinyjs(),
actionButton("btn", "Sample"),
tags$br(),
noUiSliderInput(
inputId = "noui", label = "Slider vertical:",
min = -2, max = 4, step = 1,
value = 0, margin = 100,
pips = list(mode="range", density=2),
orientation = "vertical",
width = "300px", height = "300px",
behaviour = "tap"
),
verbatimTextOutput(outputId = "res")
)
server <- function(input, output, session) {
Values <- eventReactive(input$btn, {
Min <- sample(-5:5, 1)
Max <- Min + 6
Start <- sample(Min:Max, 1)
list(min = Min, max = Max, start = Start)
}, ignoreNULL = FALSE)
observe({
if(!is.null(input$noui)){
values <- Values()
runjs(js(values$min,values$max,values$start))
}
})
output$res <- renderPrint(input$noui)
}
shinyApp(ui, server)