我正在使用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)
更新(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)
| 归档时间: |
|
| 查看次数: |
5093 次 |
| 最近记录: |