2015-06-15 17 views
5

Mi chiedevo se c'è un modo per cambiare la velocità di animazione di un cursore in lucido. Così, per un cursore che è (in ui.R):Shiny Changing Slider Animation Speed ​​

sliderInput("test_slider", 
      "Animation:", 
      min = 1, 
      max = 200, 
      value = 100, 
      animate = animationOptions(interval = ANIMATION SPEED)) 

voglio essere in grado di cambiare Velocità animazione piuttosto che tenerlo a un valore statico che ho impostato all'inizio. Inoltre, l'animazione funziona solo quando l'ho inserita nell'interfaccia utente, quindi non posso renderla un'interfaccia utente reattiva nel server. Ad esempio, non posso fare a server.R

output$test_slider <- renderUI({ 
    sliderInput("test_slider", 
       "Animation:", 
       min = 1, 
       max = 200, 
       value = 100, 
       animate = animationOptions(interval = ANIMATION SPEED)) 
}) 

e quindi aggiungere in ui.R

uiOutput("test_slider") 

Questo sarebbe stato l'ideale in quanto a personalizzare le cose come minimo e massimo (e probabilmente VELOCITÀ DI ANIMAZIONE), ma sfortunatamente farlo in questo modo fa sì che il pulsante di riproduzione non funzioni e l'animazione non venga avviata. Non riesco a capire come modificare dinamicamente i parametri di input del cursore. Anche se la tua soluzione coinvolge javascript, sarei perfettamente d'accordo. Grazie mille.


EDIT:

Quindi non ho ancora una risposta, ma ho ottenuto più vicino. Ho guardato attraverso il file javascript e ha aggiunto qualcosa di simile (in ui.R):

  numericInput("anim", 
         "interval: ", 
         value = 100), 
     sliderInput("test_slider", 
        "Animation", 
        min = 1, 
        max = 200, 
        value = 100, 
        step = 1, 
        animate = animationOptions(interval = 700, 
           playButton = icon('play', "fa-3x"), 
           pauseButton = icon('pause', "fa-3x"))), 
     singleton(
      tags$head(tags$script('Shiny.addCustomMessageHandler("testmessage", 
       function(message) {$(this).attr("data-interval", message.interval); 
           console.log($(this).attr("data-interval"))});')) 
     ) 

ho la console.log solo per dimostrare che io mando la cosa giusta in quanto la fase di stampa il valore corretto nel terminale. Poi faccio in server.R:

observe({ 
    if(!is.null(input$anim)) { 
     session$sendCustomMessage(type = "testmessage", 
           message = list(interval = input$anim, 
             controller = input$test_slider)) 
    } 
    }) 

Sto usando sia la documentazione nella repo lucido qui: https://github.com/rstudio/shiny/blob/a6cd0fdb85d5d2175ebc4fcb590386e4cedcbbd9/srcjs/input_binding_slider.js

così come la documentazione presente su questo blog qui: https://ryouready.wordpress.com/2013/11/20/sending-data-from-client-to-server-and-back-using-shiny/

Quello per il repository Github sto usando la parte qui sotto dove si dice

animInterval = self.attr("data-interval") 

dove

var self = $(this) 

Non ho mai usato javascript in precedenza, quindi potrei mancare qualcosa di ovvio. Qualsiasi aiuto è molto apprezzato!

+0

In teoria utilizzando la notazione dei punti è possibile accedere ai valori di input in ui. Quindi crei un altro slider e inserisci interval = "input.SLIDERINPUTNAME" Ma per la somereason non sono riuscito a farlo funzionare. Maggiori informazioni per accedere ai valori di input in ui: [Pannelli condizionali] (http://shiny.rstudio.com/gallery/conditionalpanel-demo.html) –

+1

Hey, grazie per l'aiuto.Ho postato qualcosa di seguito come una "risposta" in modo che possa essere visualizzata più chiaramente e potrebbe essere più vicina. Sta usando un po 'di javascript, cosa che non mi è molto familiare, ma pensavo che avrebbe dovuto funzionare. Eventuali suggerimenti? Grazie! – johnny838

+1

Penso anche che renderUI dovrebbe funzionare, quindi forse è un bug. Puoi scrivere bug report qui: [Issues] (https://github.com/rstudio/shiny/issues) –

risposta

1

non sono sicuro se ho ben capito il tuo problema, ma se faccio la seguente funzionerà:

In server.R:

output$slider_to_anim <- renderUI({ 
    sliderInput("slider", 
      "Animation:", 
      min = 1, 
      max = 200, 
      value = 100, 
      animate = animationOptions(interval = input$speed)) 
}) 

output$speed_value <- renderUI({ 
    numericInput("speed","Speed Value :",value = 100) 
}) 

e aggiungere ui.R:

uiOutpout("slider_to_anim"), 
uiOutpout("speed_value")