抑制效果submitButton启动闪亮的应用程序

问题描述:

我有一个闪亮的应用程序与反应位的用户界面,用于过滤我的数据。然后我使用这些数据进行绘图。我的UI反应位检查变量的所有可能值,并将它们作为selectizeInput中的选项提供,并从所选的所有选项开始。在我的实际应用程序中,过滤器的更改可能需要相当多的时间才能运行,因此我使用submitButton来防止应用程序不断更新。唯一的问题是应用程序的初始启动:它将选择加载到动态用户界面并选择它们,但由于进一步的反应性被submitButton阻止,所以此信息未达到图,因此它显示空图。只需要一次就可以获得所需结果。一旦完成这个应用程序按需运作。抑制效果submitButton启动闪亮的应用程序

我正在寻找一种方法来让剧情最初显示,而不必按submitButton。在我的后续玩具例子中,这可以通过用actionButton代替submitButton来很容易地完成,以便并非所有的反应都被冻结,这似乎是在其他问题中涉及到很多涉及submitButton的问题的解决方案。然而,在我的实际应用程序中有许多输入和反应性来源,所以配置actionButton并在observeEvent中捕获所有需要的效果时,submitButton完成所有这些工作时唯一的问题就是启动时,将会非常繁琐。有没有其他的方法可以使剧情在第一次启动时显示,但是从那时起遵循submitButton的行为?

一个示例应用程序:

library(shiny) 
library(ggplot2) 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel( 
     uiOutput("Cylselectui"), 
     submitButton("Apply changes") 
    ), 
    mainPanel(
    plotOutput("Carsplot") 
    ) 
) 
) 


server <- function(input, output) { 
    output$Carsplot <- renderPlot({ 
    plotdata <- subset(mtcars, cyl %in% input$Cylselection) #Filter based on cyl 

    ggplot(plotdata, aes(x = mpg, y = hp, colour = factor(cyl))) + #Create plot 
     geom_point() 
    }) 

    output$Cylselectui <- renderUI({ #Create the cyl selectize ui based on the values of cyl that are in the data 
    selectizeInput(
     'Cylselection', 'Select by Cylinder', 
     choices = sort(unique(mtcars$cyl)), 
     selected = sort(unique(mtcars$cyl)), 
     multiple = TRUE 
    ) 
    }) 
} 

shinyApp(ui = ui, server = server) 

可以使用reactive检查输入是否为空(第一次),然后提供您的默认值:

Cylselection <- reactive({ 
    if(is.null(input$Cylselection)) 
     sort(unique(mtcars$cyl)) 
    else 
     input$Cylselection}) 

    output$Carsplot <- renderPlot({ 
    plotdata <- subset(mtcars, cyl %in% Cylselection()) #Filter based on cyl 
    ggplot(plotdata, aes(x = mpg, y = hp, colour = factor(cyl))) + #Create plot 
     geom_point() 
    }) 

更优雅是把你的数据子集在反应:

plotdata <- reactive({ 
    if(is.null(input$Cylselection)) 
     mtcars 
    else 
     subset(mtcars, cyl %in% input$Cylselection)}) 

    output$Carsplot <- renderPlot({ 
    ggplot(plotdata(), aes(x = mpg, y = hp, colour = factor(cyl))) + #Create plot 
     geom_point() 
    })