r 闪亮:在 ui.R 中创建小部件 vs. renderUI + uiOutput

Nic*_*ell 5 r shiny

我有一个问题更属于“最佳实践”类型的查询。使用shinypackage in 时r,是否最好在server侧面使用创建所有小部件renderUI,然后将它们推送到uivia uiOutput?或者,如果可能,是否应该在ui侧面创建所有小部件?

例如,下面的两个应用程序做同样的事情,但在第二个应用程序中,我sliderInputserver侧面创建,然后将其推送到 ,ui而不是在ui侧面创建。(注意,此代码是从R Studio 上的Hello Shiny页面中提取的)

应用程序 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))
Run Code Online (Sandbox Code Playgroud)

App 2 - 替代方法 - 在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))
Run Code Online (Sandbox Code Playgroud)

对我来说,第二种方法更具普遍性,所以它应该会赢。但是,我不是专家,我很少看到使用这种方法,除非有特定原因需要小部件以某种方式响应。我要求响应的方式包括:

  • 有加载在数据server这最终馈送插件侧choices所以最好只加载的数据的一个时间server上的侧面和创建的微件在那里,而不是负载它serverui侧。
  • 我们需要关闭/打开小部件和/或允许它们对其他用户输入做出反应

由于我介绍的第二种方法可以处理上述两个选项,因此对我来说应该在所有情况下使用它是有意义的,即使实际上不需要在server侧面创建小部件。我注意到,在使用第二种方法时,会出现延迟,有时会在加载小部件之前出现警告/错误。这是我注意到这种方法的唯一缺点。

这些方法之一是否被视为“最佳实践”?

谢谢。