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

时间:2015-07-05 19:21:43

标签: r user-interface shiny

我正在处理一个由多个面板组成的简单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的元素(实际上我试图在不同的地方有一个元素)。

1 个答案:

答案 0 :(得分:2)

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

以下是使用函数创建具有默认参数的滑块的示例代码。请注意,在第二个标签面板中,您可以使用x(在此示例中为3次)复制lapply滑块的次数。另请注意,您可以更改默认参数。

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