Как создать событие при загрузке или событие по умолчанию в блестящем?

Я новичок в блестящем, а также в stackoverflow и ищу помощи с проблемой, с которой я сейчас застрял. Я пытаюсь создать блестящее приложение, которое собирает некоторые входные данные от пользователя и создает визуализацию на основе входных данных одним нажатием кнопки. В настоящее время это работает нормально, но один из основных вопросов заключается в том, что когда приложение загружается в первый раз, оно должно иметь визуализацию, подготовленную на основе входных данных по умолчанию.

Я вставляю пример кода, который может объяснить проблему, с которой я столкнулся:

UI.R

  #loading shiny
  library(shiny)
  
  ui<-shinyUI(fluidPage(
    titlePanel("Iris Dataset"),
    sidebarLayout(
      sidebarPanel(
        radioButtons("x", "Select X-axis:",
                     list("Sepal.Length"='a', "Sepal.Width"='b', "Petal.Length"='c', "Petal.Width"='d')),
        radioButtons("y", "Select Y-axis:",
                     list("Sepal.Length"='e', "Sepal.Width"='f', "Petal.Length"='g', "Petal.Width"='h')),
        actionButton("action","Submit")
      ),
      mainPanel(
        plotOutput("distPlot")
      )
    )
  ))
  
  #SERVER.R
  library(shiny)
  
  #loading shiny
  server<-shinyServer(function(input, output) {
    
    observeEvent(input$action,{
    output$distPlot <- renderPlot({if(input$x=='a'){i<-1}
      
      if(input$x=='b'){i<-2}
      
      if(input$x=='c'){i<-3}
      
      if(input$x=='d'){i<-4}
      
      if(input$y=='e'){j<-1}
      
      if(input$y=='f'){j<-2}
      
      if(input$y=='g'){j<-3}
      
      if(input$y=='h'){j<-4}
      
      s    <- iris[, i]
      k    <- iris[, j]
      plot(s,k)
    })
  })
  })
  
  
  shinyApp(ui<-ui, server<-server)

Теперь, если вы запустите это приложение, вы увидите, что входные данные выбираются на первом экране после загрузки (что по желанию), но визуализация появляется только после нажатия кнопки «Отправить», это из-за события наблюдателя. В реальном приложении расчеты выполняются после ввода входных данных по нажатию кнопки. Следовательно, расчет запускается только при нажатии кнопки actionButton.

Есть ли способ сохранить кнопку "Отправить" и ее событие наблюдения, но автоматически запускать визуализацию или действие, выполняемое в рамках события наблюдения, в начале, то есть при первой загрузке приложения?


person WiseChirag    schedule 20.02.2018    source источник


Ответы (1)


Использование renderPlot или других функций рендеринга внутри observeEvent считается плохой практикой. То, что вы ищете, - это реактивный объект, который представляет параметры графика. Затем вы можете получить доступ к этому реактивному объекту внутри вашего контекста renderPlot. Вот пример

library(shiny)

ui <- shinyUI(fluidPage(
  titlePanel("Iris Dataset"),
  sidebarLayout(
    sidebarPanel(
      radioButtons("x", "Select X-axis:",
                   list("Sepal.Length" = 'a', "Sepal.Width" = 'b',
                        "Petal.Length" = 'c', "Petal.Width" = 'd')),
      radioButtons("y", "Select Y-axis:",
                   list("Sepal.Length" = 'e', "Sepal.Width" = 'f', 
                        "Petal.Length" = 'g', "Petal.Width" = 'h')),
      actionButton("action", "Submit")
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
))

server <- shinyServer(function(input, output) {

  user_choice <- eventReactive(input$action,{
    if (input$x == 'a'){i <- 1}    
    if (input$x == 'b'){i <- 2}    
    if (input$x == 'c'){i <- 3}    
    if (input$x == 'd'){i <- 4}    
    if (input$y == 'e'){j <- 1}    
    if (input$y == 'f'){j <- 2}    
    if (input$y == 'g'){j <- 3}    
    if (input$y == 'h'){j <- 4}

    return(c(i, j))

    ## use ignoreNULL to fire the event at startup
  }, ignoreNULL = FALSE)

  output$distPlot <- renderPlot({
    uc <- user_choice()
    plot(iris[, uc[1]], iris[, uc[2]])
  })
})


shinyApp(ui = ui, server = server)

Объект user_choice будет обновляться всякий раз, когда пользователь нажимает кнопку или при запуске приложения.

В observeEvent также есть параметр ignoreNULL, но по какой-то причине он не дает такого же результата.

person Gregor de Cillia    schedule 20.02.2018
comment
Сэр, спасибо за ваш ответ. Просто чтобы уточнить, я использую событие наблюдения, потому что после захвата входных данных выполняются некоторые вычисления, которые затем дают параметры, необходимые для построения графика. Но я понимаю вашу точку зрения и попытаюсь использовать подход и опубликую результаты. - person WiseChirag; 21.02.2018