组织更大的Shiny应用程序的最佳实践是什么?
我认为最好的R实践也适用于Shiny.
这里讨论最佳R实践:如何组织大型R程序
链接到谷歌的R风格指南:风格指南
但是,我可以采用什么样的Shiny上下文中的独特提示和技巧,使我的Shiny代码看起来更好(更具可读性)?我想的是:
server.R这部分应采购?例如,如果我正在使用,navbarPage并且tabsetPanel在tabPanel添加几个UI元素后,我的每个代码都开始变得非常混乱.
示例代码:
server <- function(input, output) {
#Here functions and outputs..
}
ui <- shinyUI(navbarPage("My Application",
tabPanel("Component 1",
sidebarLayout(
sidebarPanel(
# UI elements..
),
mainPanel(
tabsetPanel(
tabPanel("Plot", plotOutput("plot")
# More UI elements..
),
tabPanel("Summary", verbatimTextOutput("summary")
# And some more...
),
tabPanel("Table", tableOutput("table")
# And...
)
)
)
)
),
tabPanel("Component 2"),
tabPanel("Component 3")
))
shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)
为了组织ui.R …
(我通读了这个问题,尽管标题相似,但它与我的问题无关—或者,如果是的话,我太傻了,看不出它如何适用。)
我正在对Shiny代码进行模块化,以便添加其他图形仅需要在单独的文件中添加几个功能。共有三个面板-侧面板(用户在其中选择图形),底部面板(用户在其中选择图形参数)和主面板(在其中显示图形)。
侧面板不变,但底部面板根据侧面板中的选择而改变。
side_panel.R
# UI function
sidePanelInput <- function(id, label='side panel') { # Some input w/ ns = selected_graph }
# Server function
sidePanel <- function(input, output, session) {
selected_graph <- reactive({input$selected_graph})
return(selected_graph)
Run Code Online (Sandbox Code Playgroud)
在我的app.R文件中,selected_graph同时传递到底部面板和主面板:
应用程序
# ...
sidePanel <- callModule(sidePanel, 'side')
bottomPanel <- callModule(bottomPanel, 'bottom', data=some_data, selected_graph=sidePanel)
mainPanel <- callModule(mainPanel, "main", data=some_data, selected_graph=sidePanel, params=bottomPanel)
# ...
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好(请注意,bottomPanel 还返回了一些内容,并将其传递给了mainPanel)。所有这些来回传递都很好。这是我的问题:每个图的底部面板都不同,并且在单独的文件中定义。这意味着bottomPanel模块需要知道从sidePanel吐出的反应堆中渲染什么。这也意味着我不使用UI函数bottomPanel,而只使用w /的服务器函数renderUI: …