Reaktivitet 101

Fallstudier: Bygg webbapplikationer med Shiny i R

Dean Attali

Shiny Consultant

Reaktivitetens grunder

  • Shiny använder reaktiv programmering
  • Utdata reagerar på förändringar i indata
  • När värdet på variabeln x ändras, utvärderas allt som beror på x på nytt
  • Jämför med vanlig R:

    x <- 5
    y <- x + 1
    x <- 10
    
  • Vad är värdet på y? 6 eller 11?

Fallstudier: Bygg webbapplikationer med Shiny i R

Reaktiva variabler

  • Alla indata är reaktiva
  • input$<inputId> inuti en renderfunktion gör att utdata återrenderas

    output$my_plot <- renderPlot({
        plot(rnorm( input$num ))
    })
    
  • output$my_plot beror på input$num

    • input$num ändras ⇒

      output$my_plot reagerar

Fallstudier: Bygg webbapplikationer med Shiny i R

Reaktiva kontexter

  • Reaktiva värden kan bara användas i reaktiva kontexter
  • Alla render*()-funktioner är reaktiva kontexter
  • Att använda ett reaktivt värde utanför en reaktiv kontext ⇒ fel
server <- function(input, output) { 
    print(input$num)
}
ERROR: Operation not allowed without an active reactive context.
Fallstudier: Bygg webbapplikationer med Shiny i R

Observera en reaktiv variabel

  • observe({ ... }) för att komma åt en reaktiv variabel

    server <- function(input, output) { 
        observe({ 
            print( input$num )  
        }) 
    }
    
  • Användbart för felsökning och att spåra reaktiva variabler

  • Varje reaktiv variabel skapar ett beroende
observe({ 
    print( input$num1 ) 
    print( input$num2 )
})
Fallstudier: Bygg webbapplikationer med Shiny i R

Skapa en reaktiv variabel

  • reactive({ ... }) för att skapa en reaktiv variabel

  • Fel:

    server <- function(input, output) {
        x <- input$num + 1
    }
    
    ERROR: Operation not allowed without an active reactive context.
    
  • Rätt:

    server <- function(input, output) { 
      x <- reactive({ 
          input$num + 1 
      })
    }
    
Fallstudier: Bygg webbapplikationer med Shiny i R

Reaktiva variabler

  • Anropa en egendefinierad reaktiv variabel som en funktion:
    • lägg till parenteser ()
server <- function(input, output){
    x <- reactive({
        input$num + 1
    }) 
    observe({ 
        print( input$num )
        print( x() ) 
    })
}
Fallstudier: Bygg webbapplikationer med Shiny i R

Nu kör vi en övning!

Fallstudier: Bygg webbapplikationer med Shiny i R

Preparing Video For Download...