根据条件,单击按钮时,我希望阻止dropdownbutton
(shinywidgets
)打开。这样可以避免renderUI
模式面板上的内容因缺少input
而出现dropdownButton
错误。
用户单击dropdownButton
时,通常会打开一个面板。在我的情况下,该面板包含取决于各种变量的renderUI
个元素。
如果这些变量尚不存在,renderUIs
将导致吐出错误。
我想知道的是,是否有一种方法可以查看点击
observeEvent(input$MydropdownButton, { ....})
然后在不满足条件的情况下完全阻止它打开面板,而不是将其切换为立即关闭(非工作版本)
我计划要做的是给用户一个sweetalert
,而不是通知用户必须创建或加载所需数据的选项。而且我知道该怎么做,纯粹希望以“其他方式”停止打开的部分
shinyjs::disable('MydropdownButton')
声明的观察者内部使用if
来阻止按钮的使用,但这不会允许我在点击时触发sweetalert
< / li>
renderUIs
,我是:
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
代码文件,以说明它要求不存在的数字。
服务器文件
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"))
)
```
答案 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)