sliderInput表示日期

时间:2014-08-15 16:09:40

标签: r shiny

我正在使用animationOptions中的sliderInput()制作动画。我想在滑块中使用日期/日期范围,但sliderInput()不接受日期。闪亮组中有一个post。截至2013年3月,还没有解决方案。所以我四处搜索并了解到可以使用JavaScript实现这一目标。这是post。不幸的是,我不能用JS写。所以,我搜索了更多并提出this link并编写了以下代码。这有效,但滑块上的数字令人困惑。这是在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 个答案:

答案 0 :(得分:21)

我不知道何时添加了此功能,但现在sliderInput()会自动识别日期值。一些相关参数为timeFormatstep(默认为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

答案 1 :(得分:7)

sliderInput控件提供了一些有限的格式选项。您可以在format中添加sliderInput参数,以更改滑块的显示文字。

理想情况下,您希望sliderInput提供将当前值映射到确切日期的自定义映射函数。但由于这不是一个选项,唯一的改进空间是使用format参数略微改变文本。

接受format can be found in this document

根据上述文档,您可以将sliderInput更改为:

sliderInput("foo", "Animation duration", min = -30,
                max = 30, value = 0, step = 1,
                format="## Days",
                animate = animationOptions(loop = TRUE, interval = 1000)),

这将显示为+10 Days,原来是&#34; + 10&#34;。

这可能不是你想要的,但这是你可以不用编写Javascript就可以做到的。


编辑:使用Javascript

显示自定义滑块值

如果您确实想要更改滑块的当前值标签以指示稍微复杂的值(日期,转换值等),您可以编写一些小的Javascript代码段来执行此操作。

jslider控件提供的一个示例(Shiny用于您的sliderInput)表示通过调用带有{{1}的滑块的构造函数在函数中,您可以手动将映射从当前值(数字)更改为自定义字符串(在本例中为日期)。

不要过于冗长,只需说滑块的Javascript对象称为calculate即可。您可以随时致电:

slider

其中$(select).slider() 是jQuery选择器。同样,在这种情况下,它是select,因为滑块在#foo中设置了ID foo。 启动时,示例中出现的ui.R函数将被绑定为slider.settings.calculate函数。因此,我们可以简单地覆盖slider.nice函数来实现我们的目标。

下面是一个经过修改的nice,其中包含一段Javascript,可完全覆盖ui.R函数。

ui.R

nice

我们可能想要调整的另一个细节是滑块两端的标签。为实现这一目标,我们可以:

  1. 通过调用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") ) )) ;
  2. 替换整个slider.domNode
  3. 使用类slider.generateScales()直接修改两个<span>
  4. 例如,如果我们采用方法2,我们可以修改jslider-label的{​​{1}}部分:

    HTML()

    标签将按预期显示日期。

    这当然是一些快速黑客攻击,如果对滑块进行其他一些自定义,则可能无法正常工作。

    我认为Shiny团队应该考虑在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> '))), 的{​​{1}}选项,只是为了让这样的事情变得更容易。