2015-08-09 15 views
5

Tôi có đoạn code sau trong server.R:R Shiny: Tái sử dụng tính toán dài cho các điều khiển đầu ra khác nhau

library(shiny) 

source("helpers.R") 

shinyServer(function(input, output) { 
    output$txtOutput1 <- renderText({ 
     someLengthyComputation(input$txtInput)[1] 
    }) 
    output$txtOutput2 <- renderText({ 
     someLengthyComputation(input$txtInput)[2] 
    }) 
    output$txtOutput3 <- renderText({ 
     someLengthyComputation(input$txtInput)[3] 
    }) 
}) 

helpers.R chứa các phương pháp someLengthyComputation mà trả về một vector của kích thước 3. Làm thế nào tôi có thể nhận được xung quanh gọi nó ba lần mỗi lần txtInput thay đổi và chỉ gọi nó một lần trong khi cập nhật tất cả ba điều khiển đầu ra văn bản?

Trả lời

5

Bạn chỉ có thể đặt someLengthyComputation bên trong một biểu thức reactive:

shinyServer(function(input, output) { 
    someExpensiveValue <- reactive({ 
     someLengthyComputation(input$txtInput) 
    }) 

    output$txtOutput1 <- renderText({ 
     someExpensiveValue()[1] 
    }) 

    output$txtOutput2 <- renderText({ 
     someExpensiveValue()[2] 
    }) 

    output$txtOutput3 <- renderText({ 
     someExpensiveValue()[3] 
    }) 
}) 

someLengthyComputation sẽ được kích hoạt chỉ khi input$txtInput thay đổi và là người đầu tiên của kết quả đầu ra được render khác someExpensiveValue sẽ trả về một giá trị được lưu trữ. Cũng có thể, mặc dù chiến lược thực hiện có một chút khác biệt, để sử dụng kết hợp reactiveValuesobserve.

Nếu someLengthyComputation thực sự đắt tiền, bạn nên cân nhắc thêm action button hoặc submit button và kích hoạt tính toán chỉ khi được nhấp, đặc biệt khi bạn sử dụng textInput.

Các vấn đề liên quan