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