R: Shiny - 更新 dateRangeInput 开始和结束

Posted

技术标签:

【中文标题】R: Shiny - 更新 dateRangeInput 开始和结束【英文标题】:R: Shiny - update dateRangeInput start and end 【发布时间】:2016-01-03 17:09:17 【问题描述】:

我在 RStudio 中使用“闪亮”。

我希望使用数据集的最小值和最大值更新 dateRangeInput 小部件的预选日期。 当我尝试下面的代码(仅针对开始日期进行了简化)时,开始日期不会显示在日期范围小部件的左侧框中:相反,该框显示为空白(但它实际上设置为今天的日期 - 单击在空框上显示带有今天日期的日历)。 ui.r: dateRangeInput("dates", label = "Date range", start='mydatestart', end = '2014-05-06')

实际选择了最小日期,因为它在使用时显示 ui.r: textOutput('mydatestart')

这是一个可重现的例子: ui.R

图书馆(闪亮) 闪亮的UI( 侧边栏面板( dateRangeInput("日期", label = "日期范围", start='mydatestart', end = '2014-05-06'), 文本输出('我的日期开始') ) )

服务器.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 会出现同样的问题。

你知道为什么会这样吗? 谢谢, 伊万

【问题讨论】:

【参考方案1】:
    您不能将像mydatestart 这样的字符串文字作为参数传递给dateRangeInput,因为它会解释为字符串,这就是start 字段为空的原因。你需要给它一个合法的值。 在您的shinyUI 调用中缺少几个关键功能,如下面的 cmets 所示。 将全局数据对象放在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")


【讨论】:

感谢您的快速回复。在这个例子中确实有效。但是,如何在 server.R 中使用 output 对象(如示例中的 'mydatestart')获得相同的结果?我想将此小部件用作用户上传数据集的更大闪亮应用程序的一部分。然后 dateRangeInput 小部件需要从上传的数据集中获取最小和最大日期。您是否建议在 server.R 中使用 renderUI() 代替? 我无法将其标记为这样,但您的脚本也是一个很好的答案,在 ui.R 中使用 uiOutput() - 而不是 htmlOutput() 在@Andriy_T 的 关于uiOutput 的好点,但我真的看不出与htmlOutput 的区别 来自shiny site:uiOutput 旨在与服务器端的 renderUI 一起使用。它目前只是 htmlOutput 的别名。所以是的,在未来的变化中使用uiOutput 是正确的,但现在没有区别 从未声称有区别。只是跟进我原来的答案。【参考方案2】:

您可以将dateRangeInput 放入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)

【讨论】:

以上是关于R: Shiny - 更新 dateRangeInput 开始和结束的主要内容,如果未能解决你的问题,请参考以下文章

更新数据表头而不刷新整个应用程序(R,Shiny) dataTableProxy()

在 R 中用 Shiny 绘制散点图;情节没有更新,也没有完全互动

r shiny:从另一个 rhandsontable 更新 rhandsontable

R Shiny 模块不会在同一事件中响应式更新

R Shiny:在 ObserveEvent 中更新代理表列标题

数据框不会在 Shiny R 中使用 observeEvent 更新