【问题标题】:Slider skipping values: use text box as alternative?滑块跳过值:使用文本框作为替代?
【发布时间】:2016-08-24 21:42:11
【问题描述】:

我对 Shiny 很陌生。

考虑以下几点:

ui.R

library(shiny)
shinyUI(fluidPage(

  titlePanel("The Linear Equation y = 0.1x"),

  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("x",
                  "X-value:",
                  min = 0,
                  max = 100,
                  value = 0,
                  step = 0.1)
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("linPlot")
    )
  )
))

server.R

library(shiny)
library(ggplot2)

shinyServer(function(input, output, session) {

  f <- function(x){
    0.1*x
  }


  output$linPlot <- renderPlot({

    point_f <- data.frame(x = input$x, 
                        y = f(input$x))

    ggplot(NULL, aes(x = x)) + 
      stat_function(data = data.frame(x = c(0, 100)), 
                    fun = f, geom = 'line', col = 'blue') +
      geom_point(data = point_f, aes(x = x, y = y),
                 size = 4, col = 'blue') 

  })

  session$onSessionEnded(function() { stopApp() })

})

我遇到的主要问题是滑块不允许选择 EACH 0.1。也就是说,当用户使用滑块时,会跳过各种值。我希望这个应用程序的用户会想要选择一个特定的十分之一作为值,而滑块无法选择精确的十分之一这一事实对于我的目的来说是不可接受的。

我认为这不是使用滑块的任何选项可以解决的问题,所以我还希望在侧边栏面板中添加一个文本框,其中包含以下内容:

  • 文本框中的值可以用作输入来执行滑块的操作(因此滑块和文本输入中的值 input$x 应该相同)。
  • 随着滑块的移动,文本框会更改其值以匹配滑块的值。
  • 随着文本框值的变化,滑块移动以匹配其文本框的值。
  • 区间 [0, 100] 之外的值对于文本框来说是不可接受的,理想情况下会报错。
  • 文本框的输入必须是数字,格式为 ab.c,其中 a、b 和 c 都是一位数。

理想情况下,如果滑块可以自己处理这个问题,那就太好了,但我没有找到任何表明它可以的东西。

我知道这涉及textInput,但我不确定如何超越这一步。

【问题讨论】:

  • 您试图将 1000 个值 (100*0.1) 放入宽度小于 1000 像素的小部件中,这就是它跳过值的原因。如果您将滑块设置为浏览器的整个宽度,它可能会起作用,但它仍然非常繁琐。为什么不直接使用提供文本输入和向上/向下按钮的 NumericInput 小部件?
  • @Spacedman numericInputSpinBox 一样闪亮,但它也需要手动限制范围(使用可以插入任何数值——超过增长按钮的限制)
  • @Spacedman 我希望用户能够看到趋势如何随值变化(因此是滑块)并能够输入他们感兴趣的确切值(因此文本框)。

标签: r shiny


【解决方案1】:

如果我理解正确,您需要像这样观察和更新:

library(shiny)

ui=shinyUI(fluidPage(

  titlePanel("The Linear Equation y = 0.1x"),

  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      sliderInput("x",
                  "X-value:",
                  min = 0,
                  max = 100,
                  value = 0,
                  step = 0.1),
      numericInput("x_txt","X-value:",min = 0,
                   max = 100,
                   value = 0,
                   step = 0.1)
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("linPlot")
    )
  )
))

library(shiny)
library(ggplot2)

server=shinyServer(function(input, output, session) {

  f <- function(x){
    0.1*x
  }
  observeEvent(input$x,{
    if(input$x!=input$x_txt){
    updateNumericInput(session,"x_txt",value = input$x)
    }
  })

  observeEvent(input$x_txt,{
    if( is.numeric(input$x_txt) & input$x_txt>=0 & input$x_txt<=100){


    if(input$x!=input$x_txt){
    updateNumericInput(session,"x",value = input$x_txt)
    }}else{
      updateNumericInput(session,"x_txt",value = input$x)
    }
  })

  point_x=reactive({

  })


  output$linPlot <- renderPlot({

    point_f <- data.frame(x = input$x, 
                          y = f(input$x))

    ggplot(NULL, aes(x = x)) + 
      stat_function(data = data.frame(x = c(0, 100)), 
                    fun = f, geom = 'line', col = 'blue') +
      geom_point(data = point_f, aes(x = x, y = y),
                 size = 4, col = 'blue') 

  })

  session$onSessionEnded(function() { stopApp() })

})

shinyApp(ui,server)

【讨论】:

  • 基本上是我正在寻找的,但它有一个问题。假设用户单击文本框的箭头太快。 (尝试单击其中一个箭头并按住它一会儿,然后松开。)然后它会导致滑块和文本框不规则地移动。
  • 当我关闭应用程序时它也会给我一个错误:ERROR: [on_request_read] connection reset by peer
  • @Clarinetist 我可以通过将 updateNumericInput 包装在延迟函数中来防止这种情况发生。 delay(300, updateNumericInput(session, "x_txt", value = input$x))
猜你喜欢
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多