Блестящий ввод слайдер шаг за месяцем

Я пишу блестящий и хотел слайдер для даты. Дата в моих данных помесячная, и я хотел бы сделать шаг вперед на месяц. Документы для ввода ползунка говорят, что значение шага указывается либо в секундах, либо в днях, в зависимости от типов параметров min / max. В настоящее время у меня есть:

sliderInput("slider", "Time", min=as.Date("2005-01-01"),
                              max=as.Date("2014-12-01"),
                              value=as.Date("2005-01-01"), step = 30,...)

Я хочу иметь возможность шаг за шагом, а не днем, но это кажется невозможным из того, что они мне дают. Могу ли я добавить фрагмент js, который бы дал мне такую ​​функциональность?

Пояснение: я прочитал документы по этой функции, и, насколько я понимаю, для этого нет базовых функций. Параметр формата времени после тестирования изменяет только метки, а не значения. Я видел пару сообщений, которые имеют доступ к значениям определенных виджетов, и мне было интересно, возможно ли это. Например)

<script type="text/javascript">
    $(document).ready(function() {
    var slider = $("#slider").slider();
 // override the default "nice" function.
    slider.nice = function(value) {
    var ref_date = new Date("2005-01-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("-");
                          }
                          })

1 ответ

Решение

E сть timeFormat функция в пределах sliderInput, Для получения дополнительной информации посетите виджет ввода слайдера.

РЕДАКТИРОВАТЬ:

Чтобы получить даты и использовать их позже в своем анализе, большое внимание уделяется этому вопросу. Первый день месяца с даты POSIXct с использованием lubridate и функции, предоставляемой Roland.

rm(list=ls())
library(shiny)
monthStart <- function(x) {
  x <- as.POSIXlt(x)
  x$mday <- 1
  as.Date(x)
}
ui <- basicPage(sliderInput("slider", "Time", min = as.Date("2010-01-01"),max =as.Date("2014-12-01"),value=as.Date("2014-12-01"),timeFormat="%b %Y"),
                textOutput("SliderText")
                )
server <- shinyServer(function(input, output, session){

  sliderMonth <- reactiveValues()
  observe({
    full.date <- as.POSIXct(input$slider, tz="GMT")
    sliderMonth$Month <- as.character(monthStart(full.date))
  })
  output$SliderText <- renderText({sliderMonth$Month})
})
shinyApp(ui = ui, server = server)

Это решение, которое я использую, но сначала я хотел бы объяснить логику:

  1. Как упоминалось выше, timeFormat аргумент sliderInput()функция не обеспечивает требуемую функциональность с шагом в 1 месяц. Вместо этого он просто форматирует базовые ежедневные данные, поэтому пошаговое выполнение остается неизменным с ежедневным приращением.
  2. sliderInput() есть еще один аргумент stepкоторый можно использовать для явного определения шага. Однако для ввода требуется одно целое число, поэтому векторы / диапазоны не принимаются. Учитывая, что месяцы имеют разную длину, здесь нельзя использовать одно целое число. Я пытался использоватьlubridate::months(1) а также lubridate::period(1, units = "months") - к сожалению, безрезультатно, поскольку оба были автоматически преобразованы в целое число 30 после визуализации приложением, поэтому ежемесячные приращения не были сохранены.

Я нашел решение с shinyWidgets::sliderTextInput() который создает слайдер персонажа.

Предполагая, что ваши даты хранятся как yyyy-mm-dd даты в столбце Date стола d:

sliderTextInput(
  inputId    = "myID",
  label      = "myLabel",
  choices    = as.yearmon(unique(d$Date)),
  selected   = c(as.yearmon(min(d$Date)), as.yearmon(max(d$Date))),
  grid       = TRUE,
  width      = "100%"
)

При этом вы всегда делаете шаг ежемесячно. as.yearmon() используется, чтобы ваше приложение отображало метки слайдеров в MMM YYYY формат.

Имейте в виду, что вывод слайдера - это символ, поэтому вам нужно выполнить обратное преобразование в дату:

  • as.Date(as.yearmon(input$myID[1])) для начала
  • as.Date(as.yearmon(input$myID[2])) для конца
Другие вопросы по тегам