【发布时间】:2022-01-05 17:10:51
【问题描述】:
我需要在按下按钮时从下拉输入中更新/反转两个输入。在我按下交换按钮 (reverse_xz) 的那一刻,它会做出反应,但是 updatePickerInput 不会切换我的 x 和 z 输入。
我想拥有这样的功能,一旦点击交换按钮,就可以切换已经选择的pickerInputs。然后,所有下拉选项(包括选定的)都需要反转。我们必须从向量中删除选定选项的原因是为了防止 x 和 z 输入中的重复选择。
我不确定是否必须在服务器端渲染pickerInput ui?!
下面是我的代码:
#global.R
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyWidgets)
library(shinyjs)
#variable labels
my_vars <- c("None"= "NONE",
"All" = "all_all",
"Pro" = "Pro_",
"Locomania" = "locomania_Type",
"Racer" = "race")
#ui.R
ui <- shinydashboardPlus::dashboardPage(
header = shinydashboardPlus::dashboardHeader( ),
body = shinydashboard::dashboardBody( box(textOutput("inputs") ) ),
sidebar = shinydashboardPlus::dashboardSidebar(
shinyWidgets::pickerInput(
inputId = "xvar",
label = "X Axis: ",
choices = my_vars,
options = list(
size = 5),
multiple = FALSE,
selected = "all_all"
),
# Button to reverse the choices
shiny::fluidRow(
shiny::column(12, offset = 4,
shinyWidgets::actionBttn(
inputId = "reverse_xz",
label = "",
style = "simple",
color = "primary",
icon = icon("retweet")
)
)
),
shinyWidgets::pickerInput(
inputId = "zvar",
label = "Z Axis: ",
choices = my_vars,
options = list(
size = 5),
multiple = FALSE,
selected = "race"
)
)
)
#server.R
server <- function(input, output, session) {
#
observe({
if(!is.null(input$reverse_xz))
shinyWidgets::updatePickerInput(session, "zvar",
choices = my_vars[!(my_vars %in% input$xvar)],
selected = isolate(input$zvar) )
shinyWidgets::updatePickerInput(session, "xvar",
choices = my_vars[!(my_vars %in% input$zvar)],
selected = isolate(input$xvar) )
})
# These observers remove the selected choices so both pickers are unique
observe({
if(!is.null(input$zvar))
shinyWidgets::updatePickerInput(session, "xvar",
choices = my_vars[!(my_vars %in% input$zvar)],
selected = isolate(input$xvar) )
})
observe({
if(!is.null(input$xvar))
shinyWidgets::updatePickerInput(session, "zvar",
choices = my_vars[!(my_vars %in% input$xvar)],
selected = isolate(input$zvar) )
})
# output inputs
output$inputs <- renderText({ paste0("x var: ", input$xvar,
"\n\n\n z var:", input$zvar,
"\n\n\nreverse press: ", input$reverse_xz) })
}
shiny::shinyApp(ui= ui, server= server)
提前谢谢你。我看过一些相关的帖子,但它们并不能指导我太多:
【问题讨论】:
-
observe块是否会触发?我猜你需要observe(input$reverse_xz, {...}) -
嗨,杰夫,感谢您的帮助!我确实尝试过
observeEvent(input$reverse_xz, {...}),它起作用了,但没有做太多。执行您推荐的操作时,我收到Warning: Error in : Can't access reactive value 'reverse_xz' outside of reactive consumer. i Do you need to wrap inside reactive() or observe()? 58: <Anonymous>并且应用程序崩溃。 -
我有一个关于你想要什么的问题。您是否真的想要:(1)在pickerInputs之间切换已选择的选项? (2) 限制选项,所以如果在pickerInput X中选择了选项A,那么在pickerInput Z中就不会显示选项A了?因为我从一个小时开始考虑这个问题,并认为不可能同时拥有这两者,因为它会导致无限循环。
-
嗨@gss- 抱歉,我不打算浪费任何人的时间和精力。我应该更清楚。 (1) 是的,一旦点击交换按钮,切换已经选择的pickerInputs。 (2) 是的,所有下拉选项(包括选中的)都需要反转。我们必须从向量中删除选定选项的原因是为了防止在 x 和 z 输入中重复选择。我以为我们可以通过
my_vars[!(my_vars %in% input$...)]来实现这一点?!我没有预见到更新它会造成无限循环。我欢迎任何建议或替代实现。 -
不,没关系。当我写“一个小时”时,我并没有任何负面的意思:)
标签: r shiny shinydashboard shiny-server shiny-reactivity