我想看看是否可以从 Shiny App 模块的一个实例中获取输入,并将它们应用为不同选项卡上同一模块的单独实例的默认输入。我正在努力以正确的方式提出这个问题,但我试图在下面创建一个可重现的示例。我有一个带有约 5 个选项卡的闪亮仪表板,每个选项卡都调用相同的绘图模块。
例如,在下面的代码中,我创建了一个简化的仪表板来生成绘图。如果有人点击“标签页 1”并将绘图颜色更改为“深粉色”,现在是否可以在用户点击“标签页 2”时将该输入设置为默认颜色选项?或者用户是否总是必须重新选择颜色输入?
我最初使用的选项卡/模块打算在选项卡之间具有独立性,但收到一位同事的反馈,如果他们在切换选项卡时不必重新选择所有输入选项,它将帮助用户导航我的应用程序。
我找到了一些让模块相互通信的示例, (也在这里),但还没有找到真正解决这个问题的解决方案。
附加背景:我的完整应用程序将为 5 个地理位置中的每一个提供不同的选项卡。每个位置都将允许用户选择已完成的调查以及调查数据趋势的物种。因此,如果用户(在选项卡 1 上)选择了一项调查和一个物种,那么当用户切换到选项卡 2(新地理区域)时,最好将这些选项作为第一个选项。这样,用户可以更快地比较地理区域之间的相似地块。
library(shiny)
library(shinydashboard)
# Module UI for simple plot
dataPlotUI <- function(id) {
ns <- NS(id) # create namespace for entered ID
fluidRow(
box(
plotOutput(ns("plot.1"), height = 400)
),
box(
selectInput(
ns("color.choice"), "Color:",
c("darkcyan", "darkolivegreen", "deeppink", "lightsalmon2", "slateblue2", "springgreen3")
),
sliderInput(ns("range"), label = "Range", min = 10, max = 100, value = 50)
) # end box
)
}
########################################
########################################
# Module for Server
#
serverModule <- function(input, output, session, site) {
output$plot.1 <- renderPlot({
x <- seq(1, input$range, 1) # use slider to set max of x
y <- x + rnorm(length(x), 0, 3)
par(mai = c(.6, .6, .1, .1), las = 1, bty = "l")
plot(y ~ x, pch = 20, col = input$color.choice)
})
}
########################################
########################################
# UI
ui <- dashboardPage(
# # Dashboard Header
dashboardHeader(title = "Menu"),
#
dashboardSidebar(
sidebarMenu(
id = "sidebar",
# Icons can be found: https://fontawesome.com/icons?d=gallery&m=free
menuItem("Tab Page 1", tabName = "tabA"),
menuItem("Tab Page 2", tabName = "tabB"),
menuItem("Tab Page 3", tabName = "tabC")
)
), # End Dashboard Sidebar
# Body of the dashboard
dashboardBody(
# Start with overall tabItems
tabItems(
tabItem(
tabName = "tabA",
dataPlotUI("tab_one")
),
#
tabItem(
tabName = "tabB",
dataPlotUI("tab_two")
),
tabItem(
tabName = "tabC",
dataPlotUI("tab_three")
)
)
) # end dashboard body
)
#######################################
#######################################
# Server
# Call modules
server <- function(input, output, session) {
callModule(serverModule, "tab_one")
callModule(serverModule, "tab_two")
callModule(serverModule, "tab_three")
}
shinyApp(ui = ui, server = server)