2016-06-19 31 views
5

Le espressioni reattive in Shiny si propagano dove devono andare. Possiamo sopprimere alcuni di questi comportamenti con isolate, ma possiamo sopprimere le modifiche propagate in base alla nostra espressione logica?Reattività condizionale Brillante

L'esempio che do è un semplice diagramma di dispersione e disegniamo un mirino con abline dove l'utente fa clic. Sfortunatamente, Shiny considera il risultato come una nuova trama e il nostro valore di clic viene reimpostato su NULL ... che a sua volta viene considerato come un aggiornamento del valore da propagare come al solito. La trama viene ridisegnata e NULL viene passato a entrambi gli argomenti di abline.

Il mio mod (commentato di seguito) è inserire una condizione nella chiamata renderPlot che aggiorna alcune variabili non reattive per le coordinate di tracciamento, solo quando i valori di clic non sono NULL. Funziona bene per grafici triviali, ma in realtà risulta che la trama viene disegnata due volte.

Qual è un modo migliore per farlo? C'è un modo corretto? file di

Server: file di

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:

library(shiny) 

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

Dal momento che il 'dichiarazione if' sembra di fare ciò che si vuole con questo esempio potrebbe essere buono per fornire un esempio di quando non funziona –

+0

' renderPlot' è un po 'statica, di fare quello che si vuole dovrebbe usare più librerie avanzate come 'rCharts' o' highcharter' solo per invocare quelle modifiche –

+0

Come [questo] (http://shiny.rstudio.com/reference/shiny/latest/actionButton.html)? – alistaire

risposta

2

Winston chiama questo "stato" problema di accumulo - che si desidera visualizzare non solo i dati attuali, ma qualcosa generato dalla trama precedente (il posto migliore per sapere a riguardo è https://www.rstudio.com/resources/videos/coordinated-multiple-views-linked-brushing/)

L'idea di base è creare il proprio insieme di valori reattivi e aggiornarli quando L'utente fa clic sulla trama. Non verranno invalidati fino al prossimo clic, in modo da non ottenere un comportamento circolare.

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

Grazie! Posso prendere da questo che al momento non possiamo controllare le invalidazioni con la nostra espressione logica? Presumo che questa soluzione si basi su observEvent che ha 'ignoreNULL = TRUE', e che nel caso generale, non potremmo sopprimere l'aggiornamento se' input $ click $ x' era 2 o qualcosa del genere. Se questo è il caso, potrei semplicemente modificare la domanda per riferirmi di più all'arresto del comportamento circolare. –

+0

Puoi, ma sarebbe più complicato. Penso che potrebbe essere meglio fare una nuova domanda – hadley