我有一个问题更多地属于“最佳实践”类型的调查。在shiny
中使用r
包时,最好使用server
在renderUI
一侧创建所有小部件,然后通过{{ui
将其推送到uiOutput
1}?或者,如果可能,是否应在ui
方创建所有小部件?
例如,下面的两个应用程序执行相同的操作,但在第二个应用程序中,我在sliderInput
侧创建server
,然后将其推送到ui
而不是创建它在ui
方面。 (注意,此代码是从R Studio上的Hello Shiny页面中提取的)
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))
server
侧创建小组件#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
和ui
方。由于我提出的第二种方法可以处理上述两个选项,因此即使在server
上没有真正需要创建小部件的情况下,也应该在所有情况下都使用它。侧。我注意到在使用第二种方法时,有一个延迟,有时在加载小部件之前伴有警告/错误。这是我注意到这种方法的唯一缺点。
其中一种方法是否被视为“最佳做法?”
感谢。