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

时间:2019-02-06 15:08:12

标签: r shiny shinyjs dropdownbutton

根据条件,单击按钮时,我希望阻止dropdownbuttonshinywidgets)打开。这样可以避免renderUI模式面板上的内容因缺少input而出现dropdownButton错误。

用户单击dropdownButton时,通常会打开一个面板。在我的情况下,该面板包含取决于各种变量的renderUI个元素。 如果这些变量尚不存在,renderUIs将导致吐出错误。

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

我计划要做的是给用户一个sweetalert,而不是通知用户必须创建或加载所需数据的选项。而且我知道该怎么做,纯粹希望以“其他方式”停止打开的部分

  • 我知道我可以在带有shinyjs::disable('MydropdownButton')声明的观察者内部使用if来阻止按钮的使用,但这不会允许我在点击时触发sweetalert < / li>
  • 我还知道,如果缺少所需的输入,我可以调整我的所有renderUI使其不呈现,但是到目前为止,涉及到许多renderUIs,我是:
    • A:怕弄乱代码,并且
    • B:急于找出一般是否有办法停止dropdownButtons的开通

我尝试过这样的事情:

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

但是toggleDropdownButton仅在已触发打开dropdownButton面板时才会关闭面板,因此闪亮的尝试尝试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"))
      )

```

1 个答案:

答案 0 :(得分: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)