r shiny:在ui.R中创建小部件与renderUI + uiOutput

时间:2017-12-04 16:26:41

标签: r shiny

我有一个问题更多地属于“最佳实践”类型的调查。在shiny中使用r包时,最好使用serverrenderUI一侧创建所有小部件,然后通过{{ui将其推送到uiOutput 1}?或者,如果可能,是否应在ui方创建所有小部件?

例如,下面的两个应用程序执行相同的操作,但在第二个应用程序中,我在sliderInput侧创建server,然后将其推送到ui而不是创建它在ui方面。 (注意,此代码是从R Studio上的Hello Shiny页面中提取的)

App 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侧创建小组件

#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侧加载一次数据并在那里创建小部件,而不是将其加载到serverui方。
  • 我们需要关闭/打开小部件和/或允许他们对其他用户输入做出反应

由于我提出的第二种方法可以处理上述两个选项,因此即使在server上没有真正需要创建小部件的情况下,也应该在所有情况下都使用它。侧。我注意到在使用第二种方法时,有一个延迟,有时在加载小部件之前伴有警告/错误。这是我注意到这种方法的唯一缺点。

其中一种方法是否被视为“最佳做法?”

感谢。

0 个答案:

没有答案