Мне было интересно, есть ли способ изменить скорость анимации слайдера в блестящей форме. Таким образом, для слайдера, который (в 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, поэтому мне не хватало чего-то очевидного. Любая помощь очень ценится!
В теории с использованием точечной нотации вы можете получить входные значения в ui. Таким образом, вы создаете еще один слайдер и помещаете интервал = «input.SLIDERINPUTNAME». Но для некоторого времени я не мог заставить это работать. Дополнительная информация, доступ к входным значениям в ui: [Условные панели] (http://shiny.rstudio.com/gallery/conditionalpanel-demo.html) –
Эй, спасибо за помощь.Я разместил что-то ниже как «ответ», чтобы его можно было увидеть более четко, и это может быть ближе. Он использует некоторый javascript, с которым я не очень хорошо знаком, но я думал, что это должно сработать. Какие-либо предложения? Благодаря! – johnny838
Я также считаю, что renderUI должен работать, возможно, это ошибка. Вы можете написать отчет об ошибке здесь: [Проблемы] (https://github.com/rstudio/shiny/issues) –