2016-06-19 20 views
5

Biểu thức phản ứng trong các thay đổi lan truyền sáng bóng, nơi chúng cần phải đi. Chúng ta có thể ngăn chặn một số hành vi này với isolate, nhưng chúng ta có thể ngăn chặn các thay đổi được nhân giống dựa trên biểu thức logic của chính chúng ta không?Phản ứng có điều kiện Sáng bóng

Ví dụ tôi đưa ra là một phân tán đơn giản và chúng tôi vẽ một hình chữ thập với abline nơi người dùng nhấp vào. Thật không may, Shiny xem xét kết quả là một cốt truyện mới và giá trị nhấp chuột của chúng tôi được đặt lại thành NULL ... mà lần lượt được coi là bản cập nhật cho giá trị được truyền như bình thường. Cốt truyện được vẽ lại và NULL được chuyển đến cả hai đối số của abline.

Hack của tôi (nhận xét bên dưới) là đặt điều kiện trong cuộc gọi renderPlot cập nhật một số biến không phản ứng đối với tọa độ vẽ, chỉ khi giá trị nhấp chuột không phải là NULL. Điều này làm việc tốt cho các lô nhỏ, nhưng nó thực sự dẫn đến cốt truyện được vẽ hai lần.

Cách nào tốt hơn để thực hiện việc này? Có cách nào chính xác cách không?

tập tin Server:

library(shiny) 

shinyServer(function (input, output) 
{ 
    xclick <- yclick <- NULL 
    output$plot <- renderPlot({ 
    #if (!is.null(input$click$x)){ 
     xclick <<- input$click$x 
     yclick <<- input$click$y 
    #} 
    plot(1, 1) 
    abline(v = xclick, h = yclick) 
    }) 
}) 

UI file:

library(shiny) 

shinyUI(
    basicPage(
    plotOutput("plot", click = "click", height = "400px", width = "400px") 
) 
) 
+0

Kể từ khi tuyên bố 'if' của bạn dường như để làm những gì bạn muốn với ví dụ này nó có thể là tốt để cung cấp một ví dụ khi nó không hoạt động –

+0

' renderPlot' có phần tĩnh, để làm những gì bạn muốn, bạn nên sử dụng các thư viện nâng cao hơn như 'rCharts' hoặc' highcharter' chỉ để gọi những thay đổi đó –

+0

Giống như [this] (http://shiny.rstudio.com/reference/shiny/latest/actionButton.html)? – alistaire

Trả lời

2

Winston gọi vấn đề này "trạng thái" tích lũy - bạn muốn hiển thị không chỉ là dữ liệu hiện tại, nhưng một cái gì đó được tạo ra bởi những âm mưu trước (nơi tốt nhất để tìm hiểu về điều này là tại https://www.rstudio.com/resources/videos/coordinated-multiple-views-linked-brushing/)

Ý tưởng cơ bản là tạo bộ giá trị phản ứng của riêng bạn và cập nhật chúng khi người dùng điện tử nhấp vào cốt truyện. Chúng sẽ không bị vô hiệu hóa cho đến lần nhấp tiếp theo, vì vậy bạn không nhận được hành vi tròn.

library(shiny) 

shinyApp(
    shinyUI(basicPage(plotOutput("plot", click = "click"))), 
    function(input, output) { 
    click <- reactiveValues(x = NULL, y = NULL) 
    observeEvent(input$click, { 
     click$x <- input$click$x 
     click$y <- input$click$y 
    }) 

    output$plot <- renderPlot({ 
     plot(1, 1) 
     abline(v = click$x, h = click$y) 
    }) 
    } 
) 
+0

Cảm ơn! Tôi có thể lấy nó từ điều này mà hiện tại chúng tôi không thể kiểm soát các sự mất hiệu lực với biểu thức logic của chính chúng ta không? Tôi giả sử giải pháp này dựa trên observEvent có 'ignoreNULL = TRUE', và trong trường hợp chung, chúng ta không thể ngăn chặn cập nhật nếu' input $ click $ x' là 2 hoặc cái gì đó. Nếu đúng như vậy, tôi có thể chỉ cần chỉnh sửa câu hỏi để tham khảo thêm để dừng hành vi vòng tròn. –

+0

Bạn có thể, nhưng nó sẽ phức tạp hơn. Tôi nghĩ nên hỏi một câu hỏi mới – hadley

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