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

Еще одна деталь, которую мы могли бы изменить, - это метка на обоих концах слайдера. Для этого мы могли бы:

  1. заменить весь slider.domNode позвонив slider.generateScales();
  2. напрямую изменить два <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

Другие вопросы по тегам