【问题标题】:R Shiny - disable / able shinyUI elementsR Shiny - 禁用/启用 shinyUI 元素
【发布时间】:2019-03-14 19:53:54
【问题描述】:

我正在寻找一种方法来实现在我的 shinyUI 元素上禁用/启用功能Here xiaodaigh 给出了如何禁用/启用actionButton 的提示(见下图),这是我想要的结果,但代码并不能与我拥有的其他 gui 元素一起使用经过测试(例如numericInput)。

(我知道conditionalPanel 功能,但这不是我想要的效果。)

我非常感谢任何建议,尤其是因为我对 JavaScript 不太熟悉。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您在问题中链接到的代码不适用于其他输入小部件的原因是,不同的输入小部件需要不同的 JavaScript 调用才能被禁用。另一个问题是,当 Shiny 创建一个输入元素时,有时您提供的 id 是实际 HTML 输入标签的 ID,而有时该 ID 会被赋予输入标签的容器。

    shinyjs 包有一个disable 函数,它可以与任何闪亮的输入一起工作。免责声明:我写了那个包。

    按照您的要求,您将如何实现禁用numericInput

    library(shiny)
    runApp(shinyApp(
      ui = fluidPage(
        shinyjs::useShinyjs(),
        numericInput("test", "Test", 5),
        actionButton("submit", "Choose")
      ),
      server = function(input, output, session) {
        observeEvent(input$submit, {
          shinyjs::disable("test")
        })
      }
    ))
    

    【讨论】:

    • 有没有办法为selectInput() 小部件中的特定选择执行此操作?按照您的说明,无论在 selectInput() 小部件中选择哪个选项,它似乎都会禁用我的 radioButtons() 小部件,因为服务器的输入与答案选择无关。
    • 不幸的是,您不能禁用/启用输入中的特定选项。对于复选框、单选、选择等都是如此。这仅仅是因为整个输入都有一个 id,但具体的选项没有
    • library(shinyjs) 丢失
    • @Shahryar 上面给出的代码将起作用,library() 调用不会丢失,因为我通过在每个函数调用前面加上 shinyjs:: 明确调用了 shinyjs 函数
    • 您知道是否可以在服务器功能之前禁用对象?我有一个需要相当长的时间来加载的 UI,如果我将禁用功能放入服务器功能中,我的对象只会在渲染完成后消失。而且我不希望用户看到按钮首先处于活动状态,然后在应用程序完全加载时突然变为非活动状态
    【解决方案2】:

    Dean Attali 建议的代码实际上可以稍作修改以实现按要求启用和禁用。请参见下面的示例,它根据给定的值激活或停用滑块(如果值超过范围滑块的最大值,则停用)。

    library(shiny)
    runApp(shinyApp(
        ui = fluidPage(
            shinyjs::useShinyjs(),
            numericInput("val", "Choose value (max 10)", 5),
            sliderInput(inputId = "range",
                        label = "Range",
                        min = 0,
                        max = 10,
                        step = 0.1,
                        value = c(0,2))
        ),
        server = function(input, output, session) {
            observeEvent(input$val, {
                if(input$val <= 10){
                    shinyjs::enable("range")
                }else{
                    shinyjs::disable("range")
                }
            })
        }
    ))
    
    

    【讨论】:

      【解决方案3】:

      当某个条件为 FALSE 时,你的元素“消失”了怎么办?

      如果这是您的意图,您可以将其添加到您的服务器中。R

      output$sliderInputUI <- renderUI({
          if (condition == TRUE) {
              sliderInput("id", "text", 
                   min = 1, max = 8, 
                   value = 1, step = 1
              )
          }
      })
      

      将此添加到您的 ui.R htmlOutput("sliderInputUI")

      sliderInput 只有在条件为 TRUE 时才会出现在您的 UI 中。

      【讨论】:

      • 不满足条件时如何调用“id”?当您引用不存在的输入变量时,Shiny 似乎会产生错误。
      • 您可以使用if (!is.null(input$id)) 引用不存在的输入变量。
      • 在ui中如何引用sliderInputUI?答案:uiOutput("sliderInputUI")
      • 这违背了大多数用户界面设计指南,元素不应出现和消失,而应启用/禁用。
      猜你喜欢
      • 2018-06-09
      • 2021-02-28
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多