停止 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'的方式停止开头部分
- 我知道我可以在带有
if
语句的观察器中使用 shinyjs::disable('MydropdownButton')
来阻止按钮的使用,但这不允许我在单击时触发 sweetalert
再
- 我也知道如果缺少所需的输入我可以调整我所有的渲染UI不渲染,但现在有很多
renderUIs
涉及,我是:
- 答:怕把代码弄乱了,
- B:急切想知道有没有什么办法可以大体阻止
dropdownButtons
的开启
我试过这样的事情:
observeEvent(input$MydropdownButton, {
if(!is.null(values$neededData)) { 'just open the dropdownbutton' }
else { toggleDropdownButton('TestDrop')
'run sweetalert code'}
})
但是 toggleDropdownButton
只会在 dropdownButton
面板被触发打开后才关闭它,因此 shiny 尝试 render
ui
元素,结果是错误,而不是阻止它打开。
这里有一个完整的 server
和 ui
代码文件来演示它调用不存在的号码。
服务器文件
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)
我希望根据条件单击按钮时阻止 dropdownbutton
(shinywidgets
) 打开。这是为了避免 renderUI
错误 dropdownButton
模式面板上的内容丢失 input
。
当用户单击 dropdownButton
时,它通常会打开一个面板。就我而言,此面板包含 renderUI
取决于各种变量的元素。
如果这些变量还不存在,renderUIs
将导致错误吐出。
我想知道有没有办法看点击
observeEvent(input$MydropdownButton, { ....})
然后在不满足条件时完全阻止它打开面板,而不是将其切换为立即关闭(非工作版本)
我打算做的是给用户一个 sweetalert
而不是通知用户他必须使用哪些选项来创建或加载所需的数据。而且我知道怎么发消息,纯粹是想以'if else'的方式停止开头部分
- 我知道我可以在带有
if
语句的观察器中使用shinyjs::disable('MydropdownButton')
来阻止按钮的使用,但这不允许我在单击时触发sweetalert
再 - 我也知道如果缺少所需的输入我可以调整我所有的渲染UI不渲染,但现在有很多
renderUIs
涉及,我是:- 答:怕把代码弄乱了,
- B:急切想知道有没有什么办法可以大体阻止
dropdownButtons
的开启
我试过这样的事情:
observeEvent(input$MydropdownButton, {
if(!is.null(values$neededData)) { 'just open the dropdownbutton' }
else { toggleDropdownButton('TestDrop')
'run sweetalert code'}
})
但是 toggleDropdownButton
只会在 dropdownButton
面板被触发打开后才关闭它,因此 shiny 尝试 render
ui
元素,结果是错误,而不是阻止它打开。
这里有一个完整的 server
和 ui
代码文件来演示它调用不存在的号码。
服务器文件
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)