Phản ứng 101

Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R

Dean Attali

Shiny Consultant

Cơ bản về phản ứng

  • Shiny dùng lập trình phản ứng
  • Output phản ứng khi input thay đổi
  • Khi giá trị x đổi, mọi thứ phụ thuộc x được tính lại
  • So với R thông thường:

    x <- 5
    y <- x + 1
    x <- 10
    
  • Giá trị của y là gì? 6 hay 11?

Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R

Biến phản ứng

  • Mọi input đều là phản ứng
  • input$<inputId> trong hàm render sẽ khiến output render lại

    output$my_plot <- renderPlot({
        plot(rnorm( input$num ))
    })
    
  • output$my_plot phụ thuộc input$num

    • input$num đổi ⇒

      output$my_plot phản ứng

Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R

Ngữ cảnh phản ứng

  • Giá trị phản ứng chỉ dùng trong ngữ cảnh phản ứng
  • Bất kỳ hàm render*() nào là ngữ cảnh phản ứng
  • Truy cập giá trị phản ứng ngoài ngữ cảnh phản ứng ⇒ lỗi
server <- function(input, output) { 
    print(input$num)
}
ERROR: Operation not allowed without an active reactive context.
Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R

Quan sát biến phản ứng

  • observe({ ... }) để truy cập biến phản ứng

    server <- function(input, output) { 
        observe({ 
            print( input$num )  
        }) 
    }
    
  • Hữu ích để debug, theo dõi biến phản ứng

  • Mỗi biến phản ứng tạo một phụ thuộc
observe({ 
    print( input$num1 ) 
    print( input$num2 )
})
Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R

Tạo biến phản ứng

  • reactive({ ... }) để tạo biến phản ứng

  • Sai:

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

    server <- function(input, output) { 
      x <- reactive({ 
          input$num + 1 
      })
    }
    
Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R

Biến phản ứng

  • Truy cập biến phản ứng tùy chỉnh như hàm:
    • thêm dấu ngoặc ()
server <- function(input, output){
    x <- reactive({
        input$num + 1
    }) 
    observe({ 
        print( input$num )
        print( x() ) 
    })
}
Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R

Hãy luyện tập!

Nghiên cứu tình huống: Xây dựng ứng dụng web với Shiny trong R

Preparing Video For Download...