【问题标题】:Stop dropdownButton (shinywidgets) from opening dialog in R shiny停止下拉按钮(shinywidgets)在 R 中打开对话框闪亮
【发布时间】:2019-06-30 14:05:47
【问题描述】:

我希望在根据条件单击按钮时阻止 dropdownbutton (shinywidgets) 打开。这是为了避免renderUIdropdownButton 模态面板上的内容丢失input 时出错。

当用户点击dropdownButton 时,通常会打开一个面板。在我的例子中,这个面板包含依赖于各种变量的renderUIelements。 如果这些变量还不存在,renderUIs将导致错误吐出。

我想知道的是有没有办法查看点击 observeEvent(input$MydropdownButton, { ....}) 然后在不满足条件时完全阻止它打开面板,而不是将其切换为立即关闭(非工作版本)

我打算做的是给用户一个sweetalert,而不是通知用户他必须创建或加载所需数据的选项。而且我知道如何传达信息,纯粹是想以“if else”的方式停止开头部分

  • 我知道我可以在带有ifstatement 的观察者内使用shinyjs::disable('MydropdownButton') 来阻止按钮的使用,但这将不允许我在单击时触发sweetalert
  • 我也知道,如果缺少所需的输入,我可以调整我的所有渲染 UI 以不渲染,但现在涉及到很多 renderUIs,我是:
    • A:怕把代码弄得乱七八糟,而且
    • B: 急切地想知道是否有一般方法可以阻止dropdownButtons 的打开

我尝试过这样的事情:

observeEvent(input$MydropdownButton, { 
if(!is.null(values$neededData)) { 'just open the dropdownbutton' } 
else { toggleDropdownButton('TestDrop')
'run sweetalert code'} 
})

但是toggleDropdownButton只会在dropdownButton面板已经被触发打开时关闭它,因此闪亮尝试renderui元素,导致错误,而不是阻止它打开。

这里有一个完整的serverui代码文件来演示它调用不存在的号码。

服务器文件

shinyServer = function(input, output, session) {

  values <- reactiveValues()

  output$Reset_Threshold <- renderUI({
    if(values$randomNr == 2) { actionButton(inputId = "Reset_Threshold", label = icon("undo")) }
    else if(values$randomNr == 1) { actionButton(inputId = "Reset_Threshold", label = icon("table"))  }
  })

  observeEvent(input$TestDrop, { 
    if(!is.null(values$randomNr )) { print('no problems')}
    else {  toggleDropdownButton('TestDrop') 
      # Run other code here to alert user.
    }
    })
}

界面文件

library(shiny)
library(shinyWidgets)

    ui <- fluidPage(
      dropdownButton(inputId= "TestDrop", 
                     uiOutput('Reset_Threshold'),
                     icon = icon("table"), tooltip = tooltipOptions(title = "Click"))
      )

```

【问题讨论】:

    标签: r shiny shinyjs dropdownbutton


    【解决方案1】:

    错误不是由切换下拉菜单引起的,而是引用了一个不存在的变量randomNr。当服务器逻辑中的数据未准备好时,我添加了变量和一个甜蜜的对话框,现在它可以工作了。

    但请注意,无法阻止下拉菜单打开。我们仍然需要关闭它。如果你想完全阻止它打开,你可以有条件地渲染一个常规的 Shiny actionButton 当你的数据没有准备好并且仍然会触发一个事件时。只需确保在不同条件下只呈现一个按钮,并且它们应该使用相同的输入 ID。

    function(input, output, session) {
      values <- reactiveValues(Filter_df = NULL, randomNr = 0)
    
      output$Reset_Threshold <- renderUI({
        if (values$randomNr == 2) {
          actionButton(inputId = "Reset_Threshold", label = icon("undo"))
        }
        else if (values$randomNr == 1) {
          actionButton(inputId = "Reset_Threshold", label = icon("table"))
        }
      })
    
      observeEvent(input$TestDrop, {
        if (!is.null(values$Filter_df)) {
          print("no problems")
        } else {
          toggleDropdownButton("TestDrop")
          # Run other code here to alert user.
          sendSweetAlert(session, "data not ready")
        }
      })
    }
    

    编辑

    现在只需渲染一个不同的按钮。我正在使用单个文件应用程序。R

    library(shiny)
    library(shinyWidgets)
    
    ui <- fluidPage(
      uiOutput("button")
    )
    
    server <- function(input, output, session) {
      values <- reactiveValues(Filter_df = NULL, randomNr = 0)
    
      output$button <- renderUI({
        if (values$randomNr == 1) {
          dropdownButton(
            inputId = "dropdown",
            actionButton(inputId = "Reset_Threshold", label = icon("table")),
            icon = icon("table"), tooltip = tooltipOptions(title = "Click")
          )
        } else {
          actionButton(
            inputId = "alert",
            NULL,
            icon = icon("table")
          )
        }
      })
    
      observeEvent(input$alert, {
        sendSweetAlert(session, "data not ready")
      })
    }
    
    shiny::shinyApp(ui, server)
    

    【讨论】:

    • randomNr 不存在的事实是这里的重点,以便产生错误。在我的应用程序中的某个时刻,随机 Nr 当然会存在,一旦用户加载它。如果它确实存在,就像你的答案一样,我不需要警报消息开始。也许不清楚,因为我在代码中留下了应该是 values$ranomNr 的 'values$Filter_df。
    • 我实际上是在考虑您刚刚编写的编辑,常规按钮与下拉按钮的条件渲染。另一种选择是将弹出窗口的内容放在 2 个条件面板中。如果数据丢失,则一个为空且处于活动状态,如果数据全部存在,则另一个为空。两者都很有可能,第一个可能需要更多的工作。也许确实没有直接的方法来阻止打开而不完全禁用下拉按钮
    • @Mark 没有办法完全阻止它,因为下拉按钮就是这样设计的。但是,您说尝试使用我的解决方案解决它时出现错误。您是否正在考虑快速显示一个空的下拉菜单,然后消除错误或其他问题?
    • @Mark 有条件地渲染一个动作按钮其实很容易实现。 dropdownbutton 是 actionbutton 本身的包装器。
    • @Mark 查看我对有条件渲染按钮的编辑。
    猜你喜欢
    • 2012-12-10
    • 2015-07-09
    • 2021-03-21
    • 2018-02-08
    • 2023-03-16
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多