Остановить dropdownButton (Блестящие виджеты) от открытия диалога в R блестящий - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу остановить открытие 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 только после того, как она уже сработала, чтобы открыть, и, таким образом, блестящая попытка render элемента ui с возникшей ошибкой, вместо того, чтобы заблокировать ее открытие.

Вот полные файлы кодов 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 Ответ

0 голосов
/ 06 февраля 2019

Ошибка вызвана не переключением выпадающего меню, а ссылкой на переменную 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")
    }
  })
}

EDIT

Просто создайте другую кнопку сейчас.Я использую однофайловое приложение. 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)
...