闪亮 - 更新日期范围输入的开始和结束

3
我正在使用RStudio中的“shiny”。
我希望日期范围控件(dateRangeInput widget)的预选日期能够更新为数据集的最小值和最大值。
当我尝试下面的代码(仅简化了开始日期的部分),开始日期不会显示在日期范围控件的左侧框中:相反,该框显示为空白(但实际上设置为今天的日期-点击空白框后,今天的日期日历会显示出来)。
ui.r: dateRangeInput("dates", label = "时间范围", start='mydatestart', end = '2014-05-06') 最小日期实际上已经被选中,因为使用如下代码时它会显示出来:
ui.r: textOutput('mydatestart') 这里有一个可复制的示例:
ui.R
library(shiny)
shinyUI({ sidebarPanel( dateRangeInput("dates", label = "时间范围", start='mydatestart', end = '2014-05-06'), textOutput('mydatestart') ) })

server.R

  
shinyServer(function(input, output) {
  mydate<-c("2013-04-24", "2013-04-25", "2013-04-26", "2013-04-27", "2013-04-28", "2013-04-28", "2013-04-29", "2013-04-30")
  output$mydatestart<-renderText(min(mydate))
})

使用output$mydatestart<-renderText(as.Date(min(mydate)))也会出现相同的问题。

您知道为什么会这样吗?
谢谢, Yvan

2个回答

4
  1. 您不能将字符串字面值(例如mydatestart)作为参数传递给dateRangeInput,因为它会将其解释为字符串,这就是为什么start字段为空的原因。您需要给它一个合法的值。
  2. 在您的shinyUI调用中缺少几个关键函数,如下所示的注释。
  3. 更符合惯例的做法是将全局数据对象放在global.R文件中,而不是在shinyServer函数内部定义它们。

ui.R

library(shiny)

shinyUI({
  ## fluidPage(...)
  fluidPage(
    ## sidebarLayout(...)
    sidebarLayout(
      sidebarPanel(
        dateRangeInput(
          "dates", label = "Date range",
          start = min(mydate),
          end = '2014-05-06'),
        uiOutput("mydatestart2")
      ),

      mainPanel(textOutput('mydatestart'))
    )
  )

})

server.R

library(shiny)

shinyServer(function(input, output) {
  # not accessable in UI
  output$mydatestart <- renderText(min(mydate))
  # accessable in UI
  output$mydatestart2 <- renderUI({
    dateRangeInput(
      "dates2",
      label = "Reactive Start Date",
      start = as.Date(input$dates[1]) + 7,
      end = as.Date(input$dates[1]) + 14
    )
  })
})

global.R

mydate <- c("2013-04-24", "2013-04-25", "2013-04-26",
            "2013-04-27", "2013-04-28", "2013-04-28",
            "2013-04-29", "2013-04-30")

enter image description here


enter image description here


感谢您的快速回复。在这个例子中它确实有效。然而,在 server.R 中如何使用相同的结果使用“mydatestart”对象(例如在示例中)?我希望将此小部件用作更大的闪亮应用程序的一部分,其中用户上传数据集。然后,dateRangeInput 小部件需要从上传的数据集中获取最小和最大日期。您建议在 server.R 中使用 renderUI() 吗? - YGS
我无法标记它,但是你的脚本也是一个不错的答案,可以在ui.R中使用*uiOutput()*替代@Andriy_T所使用的 *htmlOutput()*。 - YGS
uiOutput确实有一点好处,但我并没有真正看出与htmlOutput的区别。 - Andriy T.
uiOutput旨在与服务器端的renderUI一起使用。 目前它只是htmlOutput的别名。因此,是的,现在可以使用uiOutput进行未来更改,但目前还没有区别。 - Andriy T.
从来没有声称有任何区别,只是在跟进我的原始回答。 - nrussell

1
你可以将dateRangeInput放入server.R中,这样你就可以使用在server.R中定义的任何对象作为参数:
library(shiny)

ui <- shinyUI({
    sidebarPanel(
        htmlOutput("selector"),
        textOutput('mydatestart')
    )
})

server <- shinyServer(function(input, output) {
    mydate<-c("2013-04-24", "2013-04-25", "2013-04-26", "2013-04-27", "2013-04-28", "2013-04-28", "2013-04-29", "2013-04-30")
    output$mydatestart<-renderText({min(mydate)})

    output$selector <- renderUI({

        dateRangeInput("dates", label = "Date range"
                       , start=min(mydate), end = '2014-05-06')

    })

})

shinyApp(ui = ui, server = server)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接