闪亮滑块逐月输入

Mar*_*nau 8 javascript r shiny

我正在写一个闪亮的,并想要一个日期滑块.我的数据中的日期是每月一次,我想一次一个月前进.滑块输入的文档表示步长值为秒或天,具体取决于最小/最大参数类型.目前我有:

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

我希望能够逐月而不是白天,但似乎不可能从他们给我的东西.有没有我可以添加的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("-");
                          }
                          })
Run Code Online (Sandbox Code Playgroud)

Por*_*hop 15

内有一个timeFormat功能sliderInput.有关更多信息,请访问Slider Input Widget.

编辑:

为了得到日期并在以后的分析中使用它们,很多功劳都归功于这个问题.使用lubridate和Roland提供的功能,从POSIXct日期时间开始这个月的第一天.

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 这不会给我每月踩踏功能.它仅将滑块上的标签更改为格式参数.我测试了它,如果提供日期仍然按步骤前进,如果没有,则按天进行. (2认同)

Dmi*_*tin 5

这是我使用的解决方案,但首先我想解释一下逻辑:

  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%"
)
Run Code Online (Sandbox Code Playgroud)

有了这个,你总是按月递增。as.yearmon()用于使您的应用以该MMM YYYY格式显示滑块标签。

请记住,滑块输出是一个字符,因此您需要回转换为日期:

  • as.Date(as.yearmon(input$myID[1])) 作为一个开始
  • as.Date(as.yearmon(input$myID[2])) 为了一个目的