2017-02-21 52 views
1

我有一個閃亮的應用程序與反應位的用戶界面,用於過濾我的數據。然後我使用這些數據進行繪圖。我的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) 

回答

1

可以使用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() 
    }) 
相關問題