2015-06-15 7 views
5

Ich frage mich, ob es eine Möglichkeit gibt, die Animationsgeschwindigkeit eines Schiebereglers in glänzend zu ändern. Also, für einen Schieber, der (in ui.R) ist:Shiny Changing Slider Animation Geschwindigkeit

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

Ich möchte in der Lage sein ANIMATION Geschwindigkeit zu ändern anstatt es bei einem statischen Wert zu halten, die ich am Anfang gesetzt. Außerdem funktioniert die Animation nur, wenn ich sie in die UI lege, damit ich sie nicht zu einer reaktiven UI auf dem Server machen kann. Zum Beispiel kann ich nicht in server.R

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

und dann in ui.R

uiOutput("test_slider") 

Dieses Ideal wäre gewesen, hinzufügen, da ich Dinge wie min und max anpassen (und wahrscheinlich ANIMATIONSGESCHWINDIGKEIT), aber leider macht es so, dass es die Play-Taste nicht funktioniert und die Animation einfach nicht startet. Ich bin ratlos, wie ich die Schieberegler-Eingabeparameter dynamisch ändern kann. Auch wenn Ihre Lösung Javascript beinhaltet, wäre ich vollkommen in Ordnung. Ich danke dir sehr.


EDIT:

Also ich eine Antwort noch nicht haben, aber ich habe näher gekommen. Ich sah durch die JavaScript-Datei und hinzugefügt etwas wie folgt aus (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"))});')) 
     ) 

ich die console.log haben nur um zu zeigen, dass ich das Richtige schicke, da es den richtigen Wert druckt in der Terminal. Dann mache ich in server.R:

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

Ich verwende sowohl die Dokumentation in der glänzenden Repo hier: https://github.com/rstudio/shiny/blob/a6cd0fdb85d5d2175ebc4fcb590386e4cedcbbd9/srcjs/input_binding_slider.js

sowie die Dokumentation in diesem Blog hier: https://ryouready.wordpress.com/2013/11/20/sending-data-from-client-to-server-and-back-using-shiny/

Die eine für die Github Repo Ich benutze den Teil unten, wo es heißt

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

wo

var self = $(this) 

Ich habe vorher noch nie Javascript benutzt, also könnte mir etwas offensichtlich fehlen. Jede Hilfe wird sehr geschätzt!

+0

In der Theorie können Sie mit der Punktnotation auf Eingabewerte in ui zugreifen. Also erstelle ich einen anderen Slider und gebe interval = "input.SLIDERINPUTNAME" ein. Aber aus anderen Gründen konnte ich das nicht funktionieren. Weitere Informationen Zugreifen auf Eingabewerte in ui: [Conditional Panels] (http://shiny.rstudio.com/gallery/conditionalpanel-demo.html) –

+1

Hey vielen Dank für die Hilfe.Ich habe etwas unten als "Antwort" gepostet, damit es klarer betrachtet werden kann, und es könnte näher sein. Es benutzt etwas Javascript, mit dem ich nicht wirklich vertraut bin, aber ich dachte, es hätte funktionieren müssen. Irgendwelche Vorschläge? Vielen Dank! – johnny838

+1

Ich denke auch, dass RenderUI funktionieren sollte, vielleicht ist es Bug. Sie können einen Fehlerbericht hier schreiben: [Probleme] (https://github.com/rstudio/shiny/issues) –

Antwort

1

Ich bin mir nicht sicher, ob ich Ihre Frage verstehen, aber wenn ich folgendes tun funktioniert:

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) 
}) 

Und in ui.R hinzu:

uiOutpout("slider_to_anim"), 
uiOutpout("speed_value") 
Verwandte Themen