sliderInput для даты
Я делаю анимацию, используя animationOptions
в sliderInput()
, Я хочу использовать date/daterange в слайдере, но sliderInput()
не принимает дату. В блестящей группе был пост. По состоянию на март 2013 года решения еще не было. Поэтому я искал вокруг и узнал, что можно добиться этого с помощью JavaScript. Вот этот пост. К сожалению, я не могу писать в JS. Итак, я искал больше и придумал эту ссылку и написал следующие коды. Это работает, но цифры на слайдере сбивают с толку. Это единственный способ перемещаться и использовать дату в sliderInput()
? Большое спасибо, что нашли время.
server.R
library(shiny)
shinyServer(function(input, output, session) {
observe({
updateDateInput(session, "ana", value = as.Date("2014-07-01") + input$foo)
})
output$preImage <- renderImage({
filename <- normalizePath(file.path('./www',
paste(input$ana, '.png', sep='')))
list(src = filename,
alt = paste("There is no image for ", input$ana, ".", sep = ""))
}, deleteFile = FALSE)
})
ui.R
shinyUI(pageWithSidebar(
headerPanel("renderImage example"),
sidebarPanel(
sliderInput("foo", "Animation duration", min = -30,
max = 30, value = 0, step = 1,
animate = animationOptions(loop = TRUE, interval = 1000)),
dateInput("ana", "Choose a date:", value = as.Date("2014-07-01"))
),
mainPanel(
# Use imageOutput to place the image on the page
imageOutput("preImage")
)
))
2 ответа
sliderInput
control предлагает некоторые ограниченные возможности форматирования. Вы можете добавить format
параметр вашего sliderInput
изменить отображаемый текст для слайдера.
В идеале вы хотели бы sliderInput
предложить пользовательскую функцию отображения, которая отображает текущее значение на точную дату. Но так как это не вариант, единственная возможность для улучшения - немного изменить текст с помощью format
параметр.
Принято format
можно найти в этом документе.
На основании приведенного выше документа, вероятно, вы можете изменить sliderInput
в:
sliderInput("foo", "Animation duration", min = -30,
max = 30, value = 0, step = 1,
format="## Days",
animate = animationOptions(loop = TRUE, interval = 1000)),
Это будет отображаться как +10 Days
, когда изначально это было "+10".
Это может быть не совсем то, что вы хотите, но это то, что вы можете сделать без написания Javascript.
РЕДАКТИРОВАТЬ: показать настроенное значение слайдера, используя Javascript
Скажем, если вы действительно хотите изменить метку текущего значения для ползунка, чтобы указать несколько сложное значение (дата, преобразованные значения и т. Д.), Вы можете написать небольшой фрагмент кода Javascript для этого.
Один пример предоставлен jslider
контроль (это то, что Shiny использует для вашего sliderInput
) указывает, что вызывая конструктор слайдера с calculate
Функция, вы можете вручную изменить отображение с текущего значения (числовое) на пользовательскую строку (в данном случае, дату).
Не будучи слишком многословным, давайте просто скажем, что Javascript объект ползунка называется slider
, Что вы всегда можете получить, позвонив по телефону:
$(select).slider()
где select
является селектором jQuery Опять же, в этом случае это #foo
потому что слайдер имеет идентификатор foo
установить в ui.R
, Когда начато, slider.settings.calculate
Функция, показанная в примере, будет обязательно slider.nice
функция. Итак, мы можем просто переопределить nice
функция для достижения нашей цели.
Ниже модифицированный ui.R
с куском Javascript, чтобы сделать именно nice
переопределение функции.
ui.R
shinyUI(pageWithSidebar(
headerPanel("renderImage example"),
sidebarPanel(
sliderInput("foo", "Animation duration", min = -30,
max = 30, value = 0, step = 1,
animate = animationOptions(loop = TRUE, interval = 1000)),
dateInput("ana", "Choose a date:", value = as.Date("2014-07-01"))
),
mainPanel(
singleton(tags$head(HTML(
'
<script type="text/javascript">
$(document).ready(function() {
var slider = $("#foo").slider();
// override the default "nice" function.
slider.nice = function(value) {
var ref_date = new Date("2014-07-01");
// each slider step is 1 day, translating to 24 * 3600 * 1000 milliseconds
var slider_date = new Date(ref_date.getTime() + value * 24 * 3600 * 1000);
return [slider_date.getUTCFullYear(),
slider_date.getUTCMonth() + 1,
slider_date.getUTCDate()].join("-");
}
})
</script>
'))),
# Use imageOutput to place the image on the page
imageOutput("preImage")
)
))
Еще одна деталь, которую мы могли бы изменить, - это метка на обоих концах слайдера. Для этого мы могли бы:
- заменить весь
slider.domNode
позвонивslider.generateScales()
; - напрямую изменить два
<span>
с классомjslider-label
,
Например, если мы используем подход 2, мы можем изменить HTML()
часть ui.R
как:
singleton(tags$head(HTML(
'
<script type="text/javascript">
$(document).ready(function() {
var slider = $("#foo").slider();
// override the default "nice" function.
var labels = slider.domNode.find(".jslider-label span");
labels.eq(0).text("2014-06-01");
labels.eq(1).text("2014-07-31");
slider.nice = function(value) {
var ref_date = new Date("2014-07-01");
// each slider step is 1 day, translating to 24 * 3600 * 1000 milliseconds
var slider_date = new Date(ref_date.getTime() + value * 24 * 3600 * 1000);
return [slider_date.getUTCFullYear(),
slider_date.getUTCMonth() + 1,
slider_date.getUTCDate()].join("-");
}
})
</script>
'))),
И на этикетках будут отображаться даты, как и ожидалось.
Это, конечно, быстрый взлом, который может не сработать, если для слайдера были сделаны другие изменения.
Я думаю, что команда Shiny должна рассмотреть возможность добавления calculate
вариант в sliderInput
который напрямую отображается на slider.settings.calculate
Просто чтобы сделать такие вещи проще.
Я не знаю, когда эта функция была добавлена, но теперь значения даты автоматически распознаются в sliderInput()
, И некоторые связанные параметры timeFormat
а также step
(1 день по умолчанию)
sliderInput("date_range",
"Choose Date Range:",
min = as.Date("2016-02-01"), max = Sys.Date(),
value = c(as.Date("2016-02-25"), Sys.Date())
)
Ссылка: http://shiny.rstudio.com/reference/shiny/latest/sliderInput.html