停止 dropdownButton (shinywidgets) 在 R shiny 中打开对话框

Stop dropdownButton (shinywidgets) from opening dialog in R shiny

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

当用户单击 dropdownButton 时,它通常会打开一个面板。就我而言,此面板包含 renderUI 取决于各种变量的元素。 如果这些变量还不存在,renderUIs将导致错误吐出。

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

我打算做的是给用户一个 sweetalert 而不是通知用户他必须使用哪些选项来创建或加载所需的数据。而且我知道怎么发消息,纯粹是想以'if else'的方式停止开头部分

我试过这样的事情:

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

但是 toggleDropdownButton 只会在 dropdownButton 面板被触发打开后才关闭它,因此 shiny 尝试 render ui 元素,结果是错误,而不是阻止它打开。

这里有一个完整的 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.
    }
    })
}

UI 文件

library(shiny)
library(shinyWidgets)

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

```

错误不是由切换下拉菜单引起的,而是引用了一个不存在的变量 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")
    }
  })
}

编辑

现在只渲染一个不同的按钮。我正在使用单个文件 app.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)