我的问题更多地属于“最佳实践”类型的询问。使用时shiny
封装在r
,是否最好在server
侧面使用renderUI
然后将它们推向ui
via uiOutput
?或者,如果可能的话,所有小部件都应该在ui
side?
例如,下面的两个应用程序执行相同的操作,但在第二个应用程序中,我创建了sliderInput
on the server
一边,然后将其推到ui
而不是在中创建它ui
边。 (注意,此代码是从你好闪亮R Studio 页面)
应用程序 1 - “标准方法”在中创建小部件ui
#ui.R
# Define UI for application that plots random distributions
library(shiny)
ui1 <- shinyUI(fluidPage(
# Application title
titlePanel("Hello Shiny!"),
# Sidebar with a slider input for number of observations
sidebarLayout(
sidebarPanel(
sliderInput("obs",
"Number of observations:",
min = 1,
max = 1000,
value = 500)
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
))
#server.R
# Define server logic required to generate and plot a random distribution
library(shiny)
server1 <- (function(input, output) {
output$distPlot <- renderPlot({
# generate an rnorm distribution and plot it
dist <- rnorm(input$obs)
hist(dist)
})
})
runApp(shinyApp(ui = ui1, server = server1))
应用程序 2 - 替代方法 - 创建小部件server
side
#ui.R
# Define UI for application that plots random distributions
library(shiny)
ui2 <- shinyUI(fluidPage(
# Application title
titlePanel("Hello Shiny!"),
# slider comes from the si object created in server.R
sidebarLayout(
sidebarPanel(
uiOutput("si")
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
))
#server.R
# Define server logic required to generate and plot a random distribution
library(shiny)
server2 <- (function(input, output) {
#create slider with renderUI
output$si <- renderUI(
sliderInput("obs",
"Number of observations:",
min = 1,
max = 1000,
value = 500)
)
output$distPlot <- renderPlot({
# generate an rnorm distribution and plot it
dist <- rnorm(input$obs)
hist(dist)
})
})
runApp(shinyApp(ui = ui2, server = server2))
对我来说,第二种方法更通用,所以它应该获胜。但是,我不是专家,我很少看到使用这种方法,除非有特定原因需要小部件以某种方式响应。我要求响应能力的方式包括:
- 上有数据加载
server
最终供给小部件的一侧choices
所以最好只加载一次数据server
并在那里创建小部件,而不是将其加载到server
and ui
side.
- 我们需要关闭/打开小部件和/或允许它们对其他用户输入做出反应
由于我提出的第二种方法可以处理上述两个选项,因此对我来说,它应该在所有情况下使用,即使没有真正需要在server
边。我注意到,使用第二种方法时,会出现延迟,有时在加载小部件之前会出现警告/错误。这是我注意到该方法的唯一缺点。
这些方法之一是否被视为“最佳实践”?
Thanks.