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