Реактивность: основы

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

Dean Attali

Shiny Consultant

Основы реактивности

  • Shiny использует реактивное программирование
  • Вывод реагирует на изменения ввода
  • При изменении переменной x всё, что зависит от x, пересчитывается
  • В обычном R всё иначе:

    x <- 5
    y <- x + 1
    x <- 10
    
  • Чему равно y? 6 или 11?

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

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

  • Все входные значения реактивны
  • input$<inputId> внутри функции рендеринга вызывает повторный рендеринг вывода

    output$my_plot <- renderPlot({
        plot(rnorm( input$num ))
    })
    
  • output$my_plot зависит от input$num

    • input$num изменяется ⇒

      output$my_plot реагирует

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

Реактивные контексты

  • Реактивные значения можно использовать только в реактивных контекстах
  • Любая функция render*() является реактивным контекстом
  • Обращение к реактивному значению вне реактивного контекста ⇒ ошибка
server <- function(input, output) { 
    print(input$num)
}
ERROR: Operation not allowed without an active reactive context.
Примеры использования: создание веб-приложений с Shiny в R

Наблюдение за реактивной переменной

  • observe({ ... }) для обращения к реактивной переменной

    server <- function(input, output) { 
        observe({ 
            print( input$num )  
        }) 
    }
    
  • Удобно для отладки и отслеживания реактивных переменных

  • Каждая реактивная переменная создаёт зависимость
observe({ 
    print( input$num1 ) 
    print( input$num2 )
})
Примеры использования: создание веб-приложений с Shiny в R

Создание реактивной переменной

  • reactive({ ... }) для создания реактивной переменной

  • Неверно:

    server <- function(input, output) {
        x <- input$num + 1
    }
    
    ERROR: Operation not allowed without an active reactive context.
    
  • Верно:

    server <- function(input, output) { 
      x <- reactive({ 
          input$num + 1 
      })
    }
    
Примеры использования: создание веб-приложений с Shiny в R

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

  • Обращайтесь к пользовательской реактивной переменной как к функции:
    • добавьте скобки ()
server <- function(input, output){
    x <- reactive({
        input$num + 1
    }) 
    observe({ 
        print( input$num )
        print( x() ) 
    })
}
Примеры использования: создание веб-приложений с Shiny в R

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

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

Preparing Video For Download...