【问题标题】:Disable a Shiny-input which is conditional on another Shiny-input禁用以另一个闪亮输入为条件的闪亮输入
【发布时间】:2018-07-21 10:19:55
【问题描述】:

我正在尝试禁用Shiny-input,其值取决于另一个Shiny-input。以前我从shinyjs 中查看了disable() 函数,但是在我的情况下,它似乎无法禁用这种闪亮的输入。下面是我的例子:

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 中获取价值,但是用户不应该能够控制它。

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

谢谢,

【问题讨论】:

    标签: r shiny shinyjs


    【解决方案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")
    
        }
    ))
    

    【讨论】:

      【解决方案2】:

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

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

      希望这会有所帮助!



      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))
          })
        }
      ))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 2014-08-02
        • 1970-01-01
        • 2019-03-13
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多