2016-09-25 15 views
5

Tôi đã tạo một ứng dụng Sáng bóng để lấy dữ liệu từ cơ sở dữ liệu. Tôi có một số đầu vào trong phần giao diện người dùng và một số đầu ra trong phần Máy chủ.Tìm hiểu các chức năng phản ứng trong Shiny

Trong phần máy chủ Tôi có một chức năng phản ứng rằng xây dựng một truy vấn sử dụng một số nguyên liệu đầu vào và sau đó kéo trong dữ liệu từ một cơ sở dữ liệu, ví dụ:

queriedData <- reactive({ 
       query <- paste0(...,input$a,...); 
       return(db$find(query)) 
       }) 

Trong các khe đầu ra, tôi tham khảo các dữ liệu trong việc sử dụng

x <- queriedData() 

câu hỏi của tôi là:

  • tôi tin rằng các cơ sở dữ liệu được thăm dò chỉ khi đầu vào đó là tái ferred để thay đổi chức năng phản ứng. Điều này có đúng không?
  • Kết quả là, tôi đúng khi nghĩ rằng việc gọi hàm phản ứng này không sinh ra một truy vấn - tức là dữ liệu được lưu trữ và dữ liệu được lưu trữ được cung cấp?
  • Đối với các đầu vào không phải là một phần của truy vấn, tôi giả định rằng những thay đổi này không gây ra truy vấn cơ sở dữ liệu mới. Điều này có đúng không?
+1

Tôi tin rằng sự hiểu biết của bạn là chính xác. Một cách để kiểm tra là đặt một số câu lệnh 'print()' vào các hàm của bạn để xem những gì được kích hoạt khi nào. – SymbolixAU

+0

Tôi nghĩ điểm đầu tiên hơi khác một chút, giá trị phản ứng sẽ bị vô hiệu khi đầu vào nó phụ thuộc vào thay đổi, nhưng nó sẽ được đánh giá lại khi nói một số đầu ra sử dụng nhu cầu phản ứng cần cập nhật. Các nhà quan sát làm việc theo điểm đầu tiên của bạn. –

Trả lời

2

Để trả lời câu hỏi của bạn:

  1. Trên thực tế, bất kỳ biểu hiện phản ứng chỉ được xác nhận lại khi một trong những biểu hiện phản ứng nó phụ thuộc vào nó được cập nhật. Shiny thực hiện điều này để vượt qua cờ hiệu lực bất cứ khi nào một giá trị của một biểu thức phản ứng thay đổi thành tất cả các biểu thức phản ứng phụ thuộc vào nó. Lần tiếp theo các biểu thức phản ứng không hợp lệ này được sử dụng, chúng được tính toán lại. Vì vậy, trong trường hợp của bạn queriedData (đó là một biểu thức phản ứng) sẽ bị vô hiệu và do đó được cập nhật mỗi lần nó nhận được một lá cờ không hợp lệ từ input$a. Khi truy vấn cơ sở dữ liệu là một phần của phép tính đó, giả định của bạn là chính xác.
  2. Điều đó tùy thuộc. Khi input$a không thay đổi và do đó queriedData không bị vô hiệu, nó chỉ trả về dữ liệu được lưu trong bộ nhớ cache. Tuy nhiên, khi input$a đã thay đổi, queriedData được tính toán lại và do đó sẽ sinh ra một truy vấn.
  3. Vì chỉ các biểu thức phản ứng có thể vượt qua cờ không hợp lệ, đó là những biểu thức duy nhất thực sự có thể làm cho biểu thức phản ứng khác được tính toán lại. Nếu các phần khác không phản ứng, chúng cũng không thể làm mất hiệu lực và do đó không thể tính toán lại số queriedData.

Hãy nhớ rằng biểu thức phản ứng không nhất thiết phải là đầu vào. Đi sau Ví dụ:

query <- reactive({paste0(...,input$a,...)}) 
queriedData <- reactive({ 
       db$find(query()) 
       }) 
output$thedata <- renderDataTable(queriedData()) 

Bây giờ thay đổi input$a sẽ làm mất hiệu lực query, gây ra tính toán lại của nó. query, một biểu thức phản ứng, sẽ làm mất hiệu lực queriedData(), kích hoạt tính toán lại của nó. Điều này sẽ làm mất hiệu lực output$thedata và do đó cũng làm cho phần đó được tính toán lại, dẫn đến dữ liệu mới được hiển thị trong bảng dữ liệu.

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