是否可以跨应用程序复制闪亮元素

Is it possible to replicate shiny element across application

我正在开发一个由多个面板组成的简单 Shiny 应用程序,ui.R 的结构类似于以下代码:

shinyUI(navbarPage("Example",
                   tabPanel("Sample analysis",
                            sidebarLayout(
                                sidebarPanel(
                                    sliderInput("bins",
                                                "Number of bins:",
                                                min = 1,
                                                max = 50,
                                                value = 30)
                                ),
                                mainPanel(
                                    plotOutput("distPlot")
                                )
                            )),
                   tabPanel("Sample analysis 2",
                            sidebarLayout(
                                sidebarPanel(
                                    sliderInput("bins",
                                                "Number of bins (again!)",
                                                min = 1,
                                                max = 50,
                                                value = 30)
                                ),
                                mainPanel(
                                    plotOutput("distPlot")
                                )
                            ))
))

每个面板都提供对不同功能的访问,但代码的某些方面是相同的。例如,在上述示例的情况下,每个面板都可以提供对一个特定对象的某种选择机制的访问,sliderInput 被复制到两个面板中。我有兴趣探索 是否可以复制界面的同一部分 x 次而无需键入整个 sliderInput 代码?


编辑

为了使问题进一步复杂化,在我的函数中我想有一个反应组件,在线:

build_eqls_drop_down <- function(){
    sidebarPanel(selectInput("selection", h5("Selection"), dynamic_vars()),
                 uiOutput("dynamic_list_derived_according_to_selection"))
}

当封装在函数中时,uiOutput 生成的元素不会出现。此外,我很高兴该函数不带参数,因为我不介意 ui 具有相同 id 的元素(实际上我试图在不同的地方使用一个元素)。

您只需要用您想要复制的元素创建一个函数。稍后只需调用该函数。您可以在那里定义默认参数,但始终尝试在每个元素上使用不同的 inputId 以避免冲突。

这里是一个示例代码,它使用一个函数来创建一个带有默认参数的滑块。请注意,在第二个选项卡面板中,您可以使用 lapply 复制滑块 x 次(在此示例中为 3 次)。另请注意,您可以更改默认参数。

library(shiny)

build_slider <- function(id, label="Number of bins:", mxmi=c(1,50), val=30){
    sliderInput(id,
                    label,
                    min = mxmi[1],
                    max = mxmi[2],
                    value = val)
}

runApp(list(
  ui = shinyUI(navbarPage("Example",
        tabPanel("Sample analysis",
            sidebarLayout(
                sidebarPanel(
                    build_slider("bins_1")
                ),
                mainPanel(
                    plotOutput("distPlot_1")
                )
        )),
        tabPanel("Sample analysis 2",
            sidebarLayout(
                sidebarPanel(
                    lapply(1:3, function(k) { 
                        id = paste("bins", k, sep="_")
                        build_slider(id, val = k*10)
                    })
                ),
                mainPanel(
                    plotOutput("distPlot_2")
                )
        ))
    )),

    server = function(input, output, session) { }
))

您可以创建一个函数来创建任意复杂的闪亮元素。因此,您可以创建一个函数来创建一个包含任意数量的小部件和绘图的完整 tapPanel