Javascript 滚动条逐月输入
我正在写一篇有光泽的文章,想要一个日期滑块。我的数据中的日期是每月一次,我希望一次向前迈进一个月。滑块输入的值表示步长值为秒或天,具体取决于最小/最大参数类型。目前我有:Javascript 滚动条逐月输入,javascript,r,shiny,Javascript,R,Shiny,我正在写一篇有光泽的文章,想要一个日期滑块。我的数据中的日期是每月一次,我希望一次向前迈进一个月。滑块输入的值表示步长值为秒或天,具体取决于最小/最大参数类型。目前我有: sliderInput("slider", "Time", min=as.Date("2005-01-01"), max=as.Date("2014-12-01"), value=as.Date("2005-
sliderInput("slider", "Time", min=as.Date("2005-01-01"),
max=as.Date("2014-12-01"),
value=as.Date("2005-01-01"), step = 30,...)
我希望能够逐月而不是逐日,但从他们给我的东西来看,这似乎是不可能的。我是否可以添加一段js来实现这个功能
澄清说明:我已经阅读了此功能的文档,据我所知,此功能没有基本功能。测试时,“时间格式”参数仅更改标签,而不更改值。我看到过一些帖子访问某些小部件的值,我想知道这是否可能。(例如)
$(文档).ready(函数(){
变量滑块=$(“#滑块”).slider();
//覆盖默认的“nice”函数。
slider.nice=函数(值){
var参考日期=新日期(“2005-01-01”);
//每个滑块步长为1天,转换为24*3600*1000毫秒
var slider_date=新日期(ref_date.getTime()+值*24*3600*1000);
return[slider_date.getUTCFullYear(),
slider_date.getUTCMonth()+1,
slider_date.getUTCDate()]连接(“-”;
}
})
在滑块put
中有一个timeFormat
函数。欲了解更多信息,请访问
编辑:
为了找出日期并在以后的分析中使用它们,这个问题和罗兰提供的功能得到了很大的认可
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)
rm(list=ls())
图书馆(闪亮)
monthStart这是我使用的解决方案,但首先我想解释一下逻辑:
如上所述,sliderInput()
函数的timeFormat
参数没有提供所需的1个月步骤功能。相反,它只是格式化基础的每日数据,因此步进在每日增量中保持不变
sliderInput()
有另一个参数step
,可用于显式定义步进增量。但是,它需要一个整数作为输入,因此不接受向量/范围。考虑到月份的长度不同,这里不适合使用单个整数。我尝试使用lubridate::months(1)
和lubridate::period(1,units=“months”)
——但不幸的是,这两种方法在应用程序渲染后都自动转换为30的整数,因此没有保留月增量
我找到了一个使用shinyWidgets::slidertextireput()
创建字符滑块的解决方案
假设您的日期存储为表d
的Date
列中的yyyy-mm-dd
日期:
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%"
)
有了这个,你总是以每月递增的速度前进<使用code>as.yearmon()
以便应用程序以MMM-YYYY
格式显示滑块标签
请记住,滑块输出是一个字符,因此需要将其反向转换为日期:
作为开始as.Date(as.yearmon(输入$myID[1]))
表示结束as.Date(as.yearmon(输入$myID[2]))
dateInput
控件?误读了您的问题:是否将更新我的答案以供参考month@MikeWise因为我想使用滑块提供的“动画”选项,所以这不会给我每月的步进功能。它仅将滑块上的标签更改为与“格式”参数等效。我对它进行了测试,如果提供的话,日期仍然是一步一步地向前推进,如果没有的话,日期仍然是一天一步地向前推进。@Marsenau——我和你有着完全相同的需求,需要一个滑块,一次推进一个月,让我高兴的是,在中找到了一个解决方案。@JoshO'Brien,我认为整个滑块都是用那个可怕的答案重新写的,我认为没有必要。我认为让shinny
dev在他们的一个应用程序中添加此功能会更容易updates@PorkChop看起来像是'svalues=
参数,它允许指定字符向量作为输入,它是我需要的关键位。据您所知,Shinny当前的输入滑块是否支持该选项?如果不支持,您建议我让Shinny开发人员实现的功能是什么?@PorkChop看起来已经有很多相关的请求,这两个请求都有,并且Ion.RangeSloider提供了所有选项。(通过来自的链接找到这两个)。
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%"
)