2015-06-15 2 views
5

Мне было интересно, есть ли способ изменить скорость анимации слайдера в блестящей форме. Таким образом, для слайдера, который (в ui.R):Shiny Changing Slider Animation Speed ​​

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

Я хочу, чтобы иметь возможность изменить АНИМАЦИЯ SPEED, а не держать его на статическое значение, что я поставил в начале. Кроме того, анимация работает только тогда, когда я помещаю ее в ui, поэтому я не могу сделать ее реактивным пользовательским интерфейсом на сервере. Например, я не могу сделать в server.R

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

, а затем добавить в ui.R

uiOutput("test_slider") 

Это было бы идеально, так как я настроить такие вещи, как мин и макс (и, вероятно, ANIMATION SPEED), но, к сожалению, это делает так, что кнопка воспроизведения не работает, и анимация просто не запускается. Я затрудняюсь для динамического изменения входных параметров ползунка. Даже если ваше решение включает javascript, я был бы в полном порядке с этим. Огромное спасибо.


EDIT:

Так у меня нет ответа, но я уже получил ближе. Я просмотрел файл JavaScript и добавил что-то вроде этого (в 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"))});')) 
     ) 

У меня есть console.log, чтобы показать, что я посылаю правильно, так как он печатает правильное значение в Терминал. Тогда я в server.R:

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

Я использую как документацию в блестящем репо здесь: https://github.com/rstudio/shiny/blob/a6cd0fdb85d5d2175ebc4fcb590386e4cedcbbd9/srcjs/input_binding_slider.js

, а также документацию, найденную на этом блоге здесь: https://ryouready.wordpress.com/2013/11/20/sending-data-from-client-to-server-and-back-using-shiny/

Я использую приведенную ниже часть, где говорится:

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

, где

var self = $(this) 

Я до сих пор не использовал javascript, поэтому мне не хватало чего-то очевидного. Любая помощь очень ценится!

+0

В теории с использованием точечной нотации вы можете получить входные значения в ui. Таким образом, вы создаете еще один слайдер и помещаете интервал = «input.SLIDERINPUTNAME». Но для некоторого времени я не мог заставить это работать. Дополнительная информация, доступ к входным значениям в ui: [Условные панели] (http://shiny.rstudio.com/gallery/conditionalpanel-demo.html) –

+1

Эй, спасибо за помощь.Я разместил что-то ниже как «ответ», чтобы его можно было увидеть более четко, и это может быть ближе. Он использует некоторый javascript, с которым я не очень хорошо знаком, но я думал, что это должно сработать. Какие-либо предложения? Благодаря! – johnny838

+1

Я также считаю, что renderUI должен работать, возможно, это ошибка. Вы можете написать отчет об ошибке здесь: [Проблемы] (https://github.com/rstudio/shiny/issues) –

ответ

1

Я не уверен, если я понимаю ваш вопрос, но если я делаю следующее будет работать:

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

И добавить в ui.R:

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