禁用闪亮输入,该输入以另一个闪亮输入为条件

时间:2018-02-10 22:32:07

标签: r shiny shinyjs

我正在尝试停用Shiny-input,其值取决于另一个Shiny-input。之前我查看了disable()中的shinyjs函数,但在我的情况下,似乎无法禁用此类Shiny-input。以下是我的例子:

library(shiny)
library(shinyjs)
runApp(shinyApp(
  ui = fluidPage(
    useShinyjs(),
    sliderInput(inputId = "First", label = "First",
                      min = 10, max = 100, value = 40, step = 1),

    uiOutput("Second_UI")
  ),
  server = function(input, output, session) {
    output$Second_UI = renderUI({
              sliderInput(inputId = "Second", label = "Second", 
                min = 0, max = input$First, value = 5)       
            })

    disable("Second_UI")

  }
))

我基本上想要的是 - 我的第二个sliderInputSecond仍然会相应地从First获取价值,但是用户不应该控制它。

任何指针都将受到高度赞赏。

谢谢,

2 个答案:

答案 0 :(得分:1)

这不起作用的原因是你多次渲染元素,但在脚本中只禁用它一次 - 在元素实际渲染之前。

然而,我们可以很简单地解决这个问题; Shinyjs提供disabled函数,允许您将输入初始化为已禁用。所以下面给出了一个工作实例。

希望这有帮助!

enter image description here

library(shiny)
library(shinyjs)
runApp(shinyApp(
  ui = fluidPage(
    useShinyjs(),
    sliderInput(inputId = "First", label = "First",
                min = 10, max = 100, value = 40, step = 1),
    uiOutput("Second_UI")
  ),
  server = function(input, output, session) {
    output$Second_UI = renderUI({
      shinyjs::disabled(sliderInput(inputId = "Second", label = "Second", 
                  min = 0, max = input$First, value = 5))
    })
  }
))

答案 1 :(得分:1)

@Florian的答案是正确的(感谢您使用我的shinyjs包!)。

但是,我想为您的原始代码提供一种可能更简洁,更容易的替代实现。

不是将滑块创建为renderUI,因为唯一更改的是最大值,您可以使用updateSliderInput()函数每次只更改最大值。这样,元素本身只创建一次,它更快,更容易使用。

library(shiny)
library(shinyjs)
runApp(shinyApp(
    ui = fluidPage(
        useShinyjs(),
        sliderInput(inputId = "First", label = "First",
                    min = 10, max = 100, value = 40, step = 1),
        sliderInput(inputId = "Second", label = "Second", 
                    min = 0, max = 40, value = 5)
    ),
    server = function(input, output, session) {
        observe({
            updateSliderInput(session, "Second", max = input$First)
        })

        disable("Second")

    }
))