Сочетание реактивной и событийной реактивов для генерации сюжета - PullRequest
2 голосов
/ 25 мая 2019

Обзор: я использую реактивный компонент для динамического обновления набора данных на основе пользовательского ввода.Это работает без каких-либо проблем.

Дополнительное требование: я хочу раскрасить график только по нажатию кнопки.Текущая настройка: после того, как я нажму кнопку «Цвет», цвет останется, даже если я изменю набор данных.

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

library(shiny)
shinyApp(ui = fluidPage(
  sidebarPanel(
    selectInput(inputId = "dropdown", label = "Select data set:",
                choices = c("iris", "mtcars"), selected = "iris")
  ),

  mainPanel(fluidPage(
    fluidRow(plotOutput("plot"),
             actionButton("color", "Color"))
  ))
), server = function(input, output) {
  get_data <- reactive({
    if(input$dropdown == "iris") {
      return(list(dat = iris, x = "Sepal.Length", color = "Species"))
    } else {
      return(list(dat = mtcars, x = "mpg", color = "cyl"))
    }
  })
  output$plot <- renderPlot({
    dat <- get_data()
    return(plot(dat$dat[, dat$x]))
  })

  observeEvent(input$color, {
    output$plot <- renderPlot({
      dat <- get_data()
      return(plot(dat$dat[, dat$x], col = dat$dat[, dat$color]))
    })
  })
})

Фактический результат: Цвет появляется каждый раз при нажатии кнопки «Цвет», даже если я изменяю набор данных.Ожидаемый результат: Цвет должен появиться после нажатия «Цвет» для текущего набора данных.Он не должен появиться, как только я изменю набор данныхОн должен появиться только после повторного нажатия кнопки «Цвет».

Ответы [ 2 ]

2 голосов
/ 25 мая 2019

Кажется, вы хотите отслеживать состояние.Вы не можете «отменить щелчок» по кнопке, поэтому было бы лучше просто сохранить реактивное значение, чтобы указать, хотите ли вы цвета, и вы можете сбросить его при изменении набора данных.Вот такая серверная функция

function(input, output) {

  showColor <- reactiveVal(FALSE)

  get_data <- reactive({
    if(input$dropdown == "iris") {
      return(list(dat = iris, x = "Sepal.Length", color = "Species"))
    } else {
      return(list(dat = mtcars, x = "mpg", color = "cyl"))
    }
  })
  output$plot <- renderPlot({
    dat <- get_data()
    if (showColor()) {
      plot(dat$dat[, dat$x], col = dat$dat[, dat$color])
    } else {
      plot(dat$dat[, dat$x])
    }
  })
  observeEvent(input$dropdown, {
    showColor(FALSE)
  })
  observeEvent(input$color, {
    showColor(TRUE)
  })
}

Вы видите, что мы добавили часть showColor <- reactiveVal(FALSE), чтобы она не отображала цвета по умолчанию и не изменила ее на FALSE при изменении раскрывающегося списка.Мы устанавливаем его на TRUE, когда вы нажимаете кнопку «Цвет».

1 голос
/ 25 мая 2019

Вы можете явно наблюдать событие, которое вызывается input$dropdown:

function(input, output) {
  get_data <- reactive({
    if(input$dropdown == "iris") {
      return(list(dat = iris, x = "Sepal.Length", color = "Species"))
    } else {
      return(list(dat = mtcars, x = "mpg", color = "cyl"))
    }
  })
  observeEvent(input$dropdown, {
    output$plot <- renderPlot({
      dat <- get_data()
      return(plot(dat$dat[, dat$x]))
    })  
  })

  observeEvent(input$color, {
    output$plot <- renderPlot({
      dat <- get_data()
      return(plot(dat$dat[, dat$x], col = dat$dat[, dat$color]))
    })
  })
}
...