如何强制输入在模块之间采用相同的值

问题描述

我正在开发一个闪亮的仪表板,它大量使用了闪亮的模块,我的客户要求我制作它,以便我的仪表板的各个选项卡中的相同两个输入采用相同的值,而不管选项卡如何。我在执行此操作时遇到了一个大问题,并且能够使用您将在下面找到的玩具示例重新创建它。

#app.R

library(data.table)
library(shiny)
library(ggplot2)
library(ggthemes)
library(shinythemes)
source("Modules.R")

penguins <<- as.data.table(palmerpenguins::penguins)

ui = uiOutput("ui")
inputs <<- reactiveValues(species = NULL,island = NULL)

server <- function(input,output,session) {
  bill_species_server("tab1")
  flipper_mass_scatter_server("tab2")
  
  output$ui = renderUI({
    fluidPage(
      titlePanel("","Penguin Dashboard"),tabsetPanel(
         tabPanel("Bill Length by Species",ui_code("tab1")
        ),tabPanel("Flipper Length by Body Mass",ui_code("tab2")
        )
      )
    )
  })
}

# Run the application 
shinyApp(ui = ui,server = server)
#Modules.R

ui_code = function (id) {
  ns = NS(id)
  
  sidebarLayout(position = "left",sidebarPanel(
      selectInput(ns("species"),"Choose 1+ species:",choices = penguins[,sort(unique(species))],multiple = TRUE),selectInput(ns("island"),"Choose 1+ islands:",sort(unique(island))],multiple = TRUE)
    ),mainPanel(
      plotOutput(ns("plot"))
    )
  )
}

bill_species_server = function(id) {
  
  moduleServer(id,function(input,session) {
    
    observeEvent(inputs$species,ignoreInit = TRUE,ignoreNULL = TRUE,{
      if (length(inputs$species) > 0) {
        updateSelectInput(session = session,inputId = "species",selected = inputs$species)
      }
    })
    
    observeEvent(inputs$island,{
      if (length(inputs$island) > 0) {
        updateSelectInput(session = session,inputId = "island",selected = inputs$island)
      }
      
    })
    
    output$plot = renderPlot({
      
      if (length(input$species) > 0) {
        penguins = penguins[species %in% input$species]
      }
      
      if (length(input$island) > 0) {
        penguins = penguins[island %in% input$island]
      }
      
      ggplot(penguins) + geom_histogram(aes(x = `bill_length_mm`,fill = species)) + scale_fill_canva(palette = "Striking and energetic")
    })
    
    observeEvent(input$species,{
      inputs$species = input$species
    })
    
    observeEvent(input$island,{
      inputs$island = input$island
    })
    
    
  })
  return(inputs)
}

flipper_mass_scatter_server = function (id) {
  

  moduleServer(id,selected = inputs$island)
      }
      
    })
    
    output$plot = renderPlot({
      
      if (length(input$species) > 0) {
        penguins = penguins[species %in% input$species]
      }
      
      if (length(input$island) > 0) {
        penguins = penguins[island %in% input$island]
      }
      
      ggplot(penguins) + geom_point(aes(x = `flipper_length_mm`,y = body_mass_g,colour = species)) + scale_colour_canva(palette = "Striking and energetic")
    })
    
    observeEvent(input$species,{
      inputs$island = input$island
    })
  })
  return(inputs)
}

所以我在这个玩具示例中尝试链接的两个输入是 speciesisland。我已将其设置为当有人对任一输入进行新选择时,观察者应更新全局变量,在本例中我标记为 inputs。然后如果 inputs 被更新,另一个标签应该更新它自己的 selectInput。

奇怪的是,我发现使用此代码时,如果我的选择有点慢,一切正常!但是,当我快速连续单击 2+ 个选项时,它会导致在当前选项卡中发生无限循环,其中第二个选项出现,然后消失,然后出现......等等。相反,当我选择了 3 个选项时尝试快速连续删除选项,它只是不让我删除所有选项!!

好奇怪。

有人知道我的代码有什么问题,以及我如何强制两个选项卡中的输入保持与其他选项卡中选择的值相同的值?

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)