Zmienne reaktywne

Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Dean Attali

Shiny Consultant

Powielanie kodu

data <- gapminder
data <- subset(
    data,
    lifeExp >= input$life[1] & lifeExp <= input$life[2]
)
if (input$continent != "All") {
    data <- subset(
        data,
        continent == input$continent
   )
}
  • Powielony 3 razy
    1. renderTable()
    2. renderPlot()
    3. downloadHandler()
Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Zmienne reaktywne ograniczają powielanie kodu

  • Powielony kod ⇒ wiele miejsc do utrzymania
    • Przy aktualizacji kodu
    • Przy poprawianiu błędów
  • Łatwo pominąć jedno wystąpienie, co prowadzi do błędów
  • Zamiast powielać kod, należy używać zmiennych reactive()
Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Zmienne reaktywne

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() })
Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Buforowanie zmiennych reaktywnych

  • Zmienne reaktywne buforują swoje wartości
  • Pamiętają własną wartość
  • Nie przeliczają się ponownie, jeśli zależności się nie zmieniły
Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Buforowanie zmiennych reaktywnych

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

  output$plot <- renderPlot({
      ggplot(
        fit_model(input$num), ...)
  })
  • fit_model() trwa 5s
  • fit_model() wywołane dwukrotnie = 10s
x <- reactive({
    fit_model(input$num)
})

output$table <- renderTable({ x() })
output$plot <- renderPlot({ ggplot(x(), ...) })
  • x() wywołane dwukrotnie, kod wewnątrz x wykonuje się raz
  • fit_model() wywołane raz = 5s
Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Zmienne reaktywne są leniwe

  • Zmienna leniwa = obliczana dopiero gdy wartość jest potrzebna

    x <- reactive({
        fit_model(input$num)
    })
    
    output$download <- downloadHandler(
        filename = "x.csv",
        content = function(file) {
            write.csv(x(), file)
        }
    )
    
  • x() uruchamia się tylko przy pobieraniu, nie przy każdej zmianie input$num

Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Czas na ćwiczenia!

Studia przypadków: tworzenie aplikacji webowych w Shiny w R

Preparing Video For Download...