Остановить dropdownButton (Блестящие виджеты) от открытия диалога в R блестящий

Я хочу остановить dropdownbutton (shinywidgets) от открытия при нажатии кнопки в зависимости от условия. Это чтобы избежать renderUI ошибки при пропаже input для содержания на dropdownButton модальная панель.

Когда пользователь нажимает на dropdownButtonобычно открывается панель. В моем случае эта панель содержит renderUIэлементы, которые зависят от различных переменных. Если эти переменные еще не существуют, renderUIsприведет к ошибкам выплюнуть.

То, что я хотел бы знать, есть ли способ посмотреть на щелчокobserveEvent(input$MydropdownButton, { ....})и затем полностью остановите его, чтобы открыть панель, если условие не выполнено, вместо того, чтобы переключить его на немедленное закрытие (не рабочая версия)

Что я планирую сделать, это дать пользователю sweetalert вместо этого он информирует пользователя о том, какие параметры он должен создать или загрузить необходимые данные. И я знаю, как сделать сообщение, просто стараясь остановить открывающуюся часть "если еще"

  • Я знаю, что могу использовать shinyjs::disable('MydropdownButton') внутри наблюдателя с ifзаявление, чтобы заблокировать использование кнопки, но это не позволило бы мне вызвать sweetalertна клик больше
  • Я также знаю, что могу настроить все мои 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панель когда-то уже сработала, и таким образом блестящая попытка renderuiэлемент, с возникшей ошибкой, а не блокировать его от открытия.

Вот полный serverа также uiзакодируйте файлы, чтобы продемонстрировать это, вызывая несуществующие номера.

Файл SERVER

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

```

1 ответ

Решение

Ошибка вызвана не переключением выпадающего меню, а ссылкой на переменную randomNr этого не существует Я добавил переменную, а также приятный диалог, когда данные не готовы в логике сервера, теперь они работают.

Но учтите, что остановить раскрывающееся меню невозможно. Нам все еще нужно закрыть его. Если вы хотите полностью заблокировать его открытие, вы можете условно отрисовать обычный Shiny actionButton когда ваши данные не готовы и будут по-прежнему вызывать событие. Просто убедитесь, что только одна кнопка отображается в разных условиях, и они должны использовать один и тот же идентификатор ввода.

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)
Другие вопросы по тегам