响应式入门

案例研究:使用 R 的 Shiny 构建 Web 应用

Dean Attali

Shiny Consultant

响应式基础

  • Shiny 使用响应式编程
  • 输出会对输入变化做出响应
  • 当变量 x 的值变化时,依赖 x 的内容将被重新计算
  • 与常规 R 对比:

    x <- 5
    y <- x + 1
    x <- 10
    
  • y 的值是多少?6 还是 11?

案例研究:使用 R 的 Shiny 构建 Web 应用

响应式变量

  • 所有输入都是响应式的
  • 在 render 函数中使用 input$<inputId> 会触发输出重新渲染

    output$my_plot <- renderPlot({
        plot(rnorm( input$num ))
    })
    
  • output$my_plot 依赖于 input$num

    • input$num 变化 ⇒

      output$my_plot 响应

案例研究:使用 R 的 Shiny 构建 Web 应用

响应式上下文

  • 响应式值只能在响应式上下文中使用
  • 任何 render*() 函数都是响应式上下文
  • 在非响应式上下文中访问响应式值 ⇒ 报错
server <- function(input, output) { 
    print(input$num)
}
ERROR: Operation not allowed without an active reactive context.
案例研究:使用 R 的 Shiny 构建 Web 应用

观察响应式变量

  • 使用 observe({ ... }) 访问响应式变量

    server <- function(input, output) { 
        observe({ 
            print( input$num )  
        }) 
    }
    
  • 便于调试,跟踪响应式变量

  • 每个响应式变量都会创建依赖
observe({ 
    print( input$num1 ) 
    print( input$num2 )
})
案例研究:使用 R 的 Shiny 构建 Web 应用

创建响应式变量

  • 使用 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 
      })
    }
    
案例研究:使用 R 的 Shiny 构建 Web 应用

响应式变量

  • 访问自定义响应式变量时像函数一样调用:
    • 加上括号 ()
server <- function(input, output){
    x <- reactive({
        input$num + 1
    }) 
    observe({ 
        print( input$num )
        print( x() ) 
    })
}
案例研究:使用 R 的 Shiny 构建 Web 应用

Passons à la pratique !

案例研究:使用 R 的 Shiny 构建 Web 应用

Preparing Video For Download...