Реактивные переменные

Примеры использования: создание веб-приложений с Shiny в R

Dean Attali

Shiny Consultant

Дублирование кода

data <- gapminder
data <- subset(
    data,
    lifeExp >= input$life[1] & lifeExp <= input$life[2]
)
if (input$continent != "All") {
    data <- subset(
        data,
        continent == input$continent
   )
}
  • Дублируется 3 раза
    1. renderTable()
    2. renderPlot()
    3. downloadHandler()
Примеры использования: создание веб-приложений с Shiny в R

Реактивные переменные сокращают дублирование кода

  • Дублированный код ⇒ несколько мест для поддержки
    • При обновлении кода
    • При исправлении ошибок
  • Легко пропустить один фрагмент, что приводит к ошибкам
  • Используйте переменные reactive() вместо дублирования кода
Примеры использования: создание веб-приложений с Shiny в R

Реактивные переменные

output$my_table <- renderTable({
    data <- gapminder
    data <- subset(
        data,
        lifeExp >= input$life[1] & lifeExp <= input$life[2]
    )
})
my_data <- reactive({

data <- gapminder data <- subset( data, lifeExp >= input$life[1] & lifeExp <= input$life[2] )
})
output$my_table <- renderTable({ my_data() })
Примеры использования: создание веб-приложений с Shiny в R

Кэширование реактивных переменных

  • Реактивные переменные кэшируют свои значения
  • Запоминают собственное значение
  • Не пересчитываются, если зависимости не изменились
Примеры использования: создание веб-приложений с Shiny в R

Кэширование реактивных переменных

  output$table <- renderTable({
      fit_model(input$num)
  })

  output$plot <- renderPlot({
      ggplot(
        fit_model(input$num), ...)
  })
  • fit_model() выполняется 5 с
  • fit_model() вызывается дважды = 10 с
x <- reactive({
    fit_model(input$num)
})

output$table <- renderTable({ x() })
output$plot <- renderPlot({ ggplot(x(), ...) })
  • x() вызывается дважды, код внутри x выполняется один раз
  • fit_model() вызывается один раз = 5 с
Примеры использования: создание веб-приложений с Shiny в R

Реактивные переменные — «ленивые»

  • «Ленивая» переменная не вычисляется, пока значение не потребуется

    x <- reactive({
        fit_model(input$num)
    })
    
    output$download <- downloadHandler(
        filename = "x.csv",
        content = function(file) {
            write.csv(x(), file)
        }
    )
    
  • x() выполняется только при запросе загрузки, а не при каждом изменении input$num

Примеры использования: создание веб-приложений с Shiny в R

Давайте потренируемся!

Примеры использования: создание веб-приложений с Shiny в R

Preparing Video For Download...