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")
)
)
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 –
' renderPlot' è un po 'statica, di fare quello che si vuole dovrebbe usare più librerie avanzate come 'rCharts' o' highcharter' solo per invocare quelle modifiche –
Come [questo] (http://shiny.rstudio.com/reference/shiny/latest/actionButton.html)? – alistaire