2017-02-21 20 views
1

У меня есть блестящее приложение с реактивным битом пользовательского интерфейса, который используется для фильтрации моих данных. Затем я использую данные для построения графика. Мой реактивный бит пользовательского интерфейса проверяет все возможные значения переменной, предлагает их как выбор в selectizeInput и начинается со всех выбранных вариантов. В моих реальных изменениях приложения в фильтре может потребоваться довольно много времени для запуска, поэтому у меня есть submitButton, чтобы предотвратить постоянное обновление приложения. Единственная проблема заключается в первоначальном запуске приложения: он загружает выбор в динамический интерфейс и выбирает их, но поскольку дальнейшая реактивность блокируется submitButton, эта информация не доходит до графика и поэтому показывает пустой участок , Все, что необходимо для получения желаемого результата, сразу же попадает в . Как только это будет сделано, приложение будет работать по своему желанию.подавлять эффект submitButton при запуске блестящего приложения

Я ищу способ сделать изначально сюжет, не нажимая submitButton. В моем следующем примере игрушек это, вероятно, можно было бы сделать довольно легко, заменив submitButton на actionButton так, чтобы не вся реакционная способность была заморожена, что, по-видимому, является решением множества проблем, связанных с submitButton с в другом вопросе. Тем не менее, в моем реальном приложении есть множество входов и источников реактивности, поэтому настройка actionButton и захват всех желаемых эффектов в observeEvent s будет довольно утомительным, когда 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() 
    })