对数刻度上的闪亮滑块

enr*_*ero 21 r slider shiny

我正在使用Shiny构建一个简单的Web应用程序,其中包含一个滑块,用于控制输出中应显示的p值.

如何使滑块作用于对数而不是线性?

目前我有:

sliderInput("pvalue",
            "PValue:",
            min = 0,
            max = 1e-2,
            value = c(0, 1e-2)
),
Run Code Online (Sandbox Code Playgroud)

谢谢!

Dea*_*ali 13

我不确定你想要什么作为输出,但我所做的是可能的p值为[0,0.00001,0.0001,0.001,0.01].如果你想要一些不同的东西,希望这个答案是一个很好的起点.

基本上,首先我创建了一个包含数字值(0,0.0000.1,...)的数组,然后我只使用滑块API中的特殊更新函数使这些值粘在滑块上.一旦你弄清楚如何使用滑块的API,这很简单.此外,由于某种原因,在RStudio内运行这看起来很奇怪,但在浏览器中它很好.另外,请注意我有5ms的延迟,因为我想确保在滑块初始化后运行.不是最干净的解决方案,可能有更好的方法,但它确实有效.

library(shiny)

JScode <-
  "$(function() {
    setTimeout(function(){
      var vals = [0];
      var powStart = 5;
      var powStop = 2;
      for (i = powStart; i >= powStop; i--) {
        var val = Math.pow(10, -i);
        val = parseFloat(val.toFixed(8));
        vals.push(val);
      }
      $('#pvalue').data('ionRangeSlider').update({'values':vals})
    }, 5)})"

runApp(shinyApp(
  ui = fluidPage(
    tags$head(tags$script(HTML(JScode))),

    sliderInput("pvalue",
                "PValue:",
                min = 0,
                max = 1e-2,
                value = c(0, 1e-2)
    )
  ),
  server = function(input, output, session) {
  }
))
Run Code Online (Sandbox Code Playgroud)


seb*_*opf 11

不确定这个线程是否仍处于活动状态但是为了防止想要使用ionRangeSlider的prettify函数属性添加更通用的"logify"inputSlider方式而不是覆盖这些值,其优点是你可以定义min,max,像往常一样,inputSlider的step和default值然后在Javascript端发生的所有事情都是显示值的变化(显示两个选项,一个用于数字输出,一个用于科学记数法):

library(shiny)

# logifySlider javascript function
JS.logify <-
"
// function to logify a sliderInput
function logifySlider (sliderId, sci = false) {
  if (sci) {
    // scientific style
    $('#'+sliderId).data('ionRangeSlider').update({
      'prettify': function (num) { return ('10<sup>'+num+'</sup>'); }
    })
  } else {
    // regular number style
    $('#'+sliderId).data('ionRangeSlider').update({
      'prettify': function (num) { return (Math.pow(10, num)); }
    })
  }
}"

# call logifySlider for each relevant sliderInput
JS.onload <-
"
// execute upon document loading
$(document).ready(function() {
  // wait a few ms to allow other scripts to execute
  setTimeout(function() {
    // include call for each slider
    logifySlider('log_slider', sci = false)
    logifySlider('log_slider2', sci = true)
  }, 5)})
"

ui <- fluidPage(
  tags$head(tags$script(HTML(JS.logify))),
  tags$head(tags$script(HTML(JS.onload))),

  sliderInput("log_slider", "Log Slider (numbers):",
              min = -5, max = 3, value = -4, step = 1),

  sliderInput("log_slider2", "Log Slider (sci. notation):",
              min = -5, max = 3, value = 1, step = 0.5),

  br(),

  textOutput("readout1"),
  textOutput("readout2")
)

server <- function(input, output, session) {
  output$readout1 <- reactive({
    paste0("Selected value (numbers): ", input$log_slider, " = ", 10^input$log_slider)
  })

  output$readout2 <- reactive({
    paste0("Selected value (sci. notation): ", input$log_slider2, " = ", 10^input$log_slider2)
  })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

产量

  • 我找到了一个方法.将对JS.onload的调用插入到渲染UI中就可以了.`session $ sendCustomMessage(type ='jsCode',list(value = JS.onload))`.你还需要在ui:`tags $ head(标签$ script(HTML('Shiny.addCustomMessageHandler("jsCode",function(message){eval(message.value);});')))` (3认同)

pha*_*man 7

更新(2018年5月):

现在可以通过shinyWidgets::sliderTextInput()控制来实现.您可以指定自定义步骤(例如,对数间隔),滑块可以逐步执行.缺点是您需要指定每个步骤,而不是max和min,并让滑块计算步骤,但它适用于此类应用程序.

小例子:

library(shiny)
ui <- fluidPage(
  shinyWidgets::sliderTextInput("pvalue2","PValue:",
                            choices=c(0, 0.0001, 0.001, 0.01),
                            selected=0, grid = T)
)
server <- function(input, output) {}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)