R 闪亮的日期滑块动画(按月)(当前按天)

2023-11-21

我对 R 比较满意,对 Shiny 则不太满意,尽管这不是我的第一个 Shiny 应用程序。

我有一个数据框,其中包含经/纬度以及每个新客户进入系统的日期/时间。我还根据 startDate 变量创建了其他变量,例如年、月、周、年月 (ym) 和年周 (yw):

  id      lat       lon  startDate year month week         ym         yw
1  1 45.53814 -73.63672 2014-04-09 2014     4   15 2014-04-01 2014-04-06
2  2 45.51076 -73.61029 2014-06-04 2014     6   23 2014-06-01 2014-06-01
3  3 45.43560 -73.60100 2014-04-30 2014     4   18 2014-04-01 2014-04-27
4  4 45.54332 -73.56000 2014-05-30 2014     5   22 2014-05-01 2014-05-25
5  5 45.52234 -73.59022 2014-05-01 2014     5   18 2014-05-01 2014-04-27

我想用传单映射每个客户(已完成),但随后我想通过仅显示特定日期范围内的新客户来动画化我的应用程序。

我想逐步浏览每月日期(ym 变量:2016-01-01、2016-02-01、2016-03-01...)而不是按天(或已支持的 x 天),因为每月日期并不总是距离下个月有 30 天的一步。 这是我当前的应用程序:

library(shiny)
library(leaflet)
library(dplyr)

df <- data.frame(id = 1:5, 
             lat = c(45.53814, 45.51076, 45.4356, 45.54332, 45.52234), 
             lon = c(-73.63672, -73.61029, -73.6010, -73.56000, -73.59022),
             startDate = as.Date(c("2014-04-09", "2014-06-04", "2014-04-30", "2014-05-30", "2014-05-01")),
             year = c(2014, 2014, 2014, 2014, 2014),
             month = c(4, 6, 4, 5, 5),
             week = c(15, 23, 18, 22, 18),
             ym = as.Date(c("2014-04-01", "2014-06-01", "2014-04-01", "2014-05-01", "2014-05-01")),  # Year-Month
             yw = as.Date(c("2014-04-06", "2014-06-01", "2014-04-27", "2014-05-25", "2014-04-27"))   # Year-Week
             )


ui <- bootstrapPage(
  tags$style(type = "text/css", "html, body {width:100%;height:100%}"),

  leafletOutput("map", width = "83%", height = "100%"),

  absolutePanel(
top = 1,
right = 10,

div(
  style = "height: 80px;",
  sliderInput(
    "time",
    "Time Slider",
    min(df$month),
    max(df$month),
    value = c(min(df$month), max(df$month)),
    step = 1,
    animate = animationOptions(interval = 2500)

  ) # end sliderInput
) # end div
  ) # end absolutePanel
) # end bootstrapPage

server <- shinyServer(function(input, output, session){

  output$map <- renderLeaflet({
    leaflet(data = df %>% filter(month >= input$time[1], month <=             input$time[2])) %>% addTiles() %>% 
  addMarkers(~lon, ~lat) %>% 
  setView(lng = -73.6, lat = 45.52, zoom = 12)
    })
  })
shinyApp(ui = ui, server = server)

问题:如何使用滑块动画选项来过滤数据以切换到下个月等?现在我循环遍历变量月份,但我有 8 年的数据,所以我还需要考虑年份,例如循环遍历 ym 变量。

我看到一些工作已经完成here and here,但要么它没有满足我的需求,要么我不理解提供的js代码。如果是这种情况,需要如何更改我的代码来反映我的需求?

谢谢。


编辑2017年10月13日:该功能现在可以在包中使用shinyWidgets(有不同的名称:sliderTextInput()).

您可以使用此自定义滑块功能。它需要一个字符向量来进行选择,因此您可以使用任何您想要的格式作为格式并逐步执行选择。缺点是您必须手动拆分服务器中的输入:

应用程序示例:

# List of months
choices_month <- format(seq.Date(from = as.Date("2014-01-01"), by = "month", length.out = 36), "%B-%Y")

library("shiny")

# ui
ui <- fluidPage(
  br(),

  # custom slider function
  sliderValues(
    inputId = "test", label = "Month", width = "100%",
    values = choices_month, 
    from = choices_month[2], to = choices_month[6],
    grid = FALSE, animate = animationOptions(interval = 1500)
  ),
  verbatimTextOutput("res")
)

# server
server <- function(input, output, session) {
  output$res <- renderPrint({
    print(input$test) # you have to split manually the result by ";"
    print(as.Date(paste("01", unlist(strsplit(input$test, ";")), sep="-"), format="%d-%B-%Y"))
  })
}

# App
shinyApp(ui = ui, server = server)

滑块值函数:

sliderValues <- function (inputId,
                          label,
                          values,
                          from,
                          to = NULL,
                          grid = TRUE,
                          width = NULL,
                          postfix = NULL,
                          prefix = NULL,
                          dragRange = TRUE,
                          disable = FALSE,
                          animate = FALSE) {
  validate_fromto <-
    function(fromto = NULL,
             values = NULL,
             default = 0) {
      if (!is.null(fromto)) {
        if (is.character(values) & is.numeric(fromto)) {
          fromto <- fromto - 1
        } else {
          fromto <- which(values == fromto) - 1
        }
      } else {
        fromto <- default
      }
      return(fromto)
    }

  sliderProps <- shiny:::dropNulls(
    list(
      class = "js-range-slider",
      id = inputId,
      `data-type` = if (!is.null(to))
        "double"
      else
        "single",
      `data-from` = validate_fromto(fromto = from, values = values),
      `data-to` = validate_fromto(
        fromto = to,
        values = values,
        default = length(values)
      ),
      `data-grid` = grid,
      `data-prefix` = if (is.null(prefix)) {
        "null"
      } else {
        shQuote(prefix, "sh")
      },
      `data-postfix` = if (is.null(postfix)) {
        "null"
      } else {
        shQuote(postfix, "sh")
      },
      `data-drag-interval` = dragRange,
      `data-disable` = disable,
      `data-values` = if (is.numeric(values)) {
        paste(values, collapse = ", ")
      } else {
        paste(shQuote(values, type = "sh"), collapse = ", ")
      }
    )
  )
  sliderProps <- lapply(
    X = sliderProps,
    FUN = function(x) {
      if (identical(x, TRUE))
        "true"
      else if (identical(x, FALSE))
        "false"
      else
        x
    }
  )
  sliderTag <- tags$div(
    class = "form-group shiny-input-container",
    style = if (!is.null(width))
      paste0("width: ", htmltools::validateCssUnit(width), ";"),
    if (!is.null(label))
      shiny:::controlLabel(inputId, label),
    do.call(
      tags$input,
      list(
        type = if (is.numeric(values) &
                   is.null(to)) {
          "number"
        } else {
          "text"
        },
        #class = "js-range-slider",
        id = inputId,
        name = inputId,
        value = ""
      )
    ),
    tags$style(
      whisker::whisker.render(
        template =
          "input[id='{{id}}'] {
        -moz-appearance:textfield;
}
input[id='{{id}}']::-webkit-outer-spin-button,
input[id='{{id}}']::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}", data = list(id = inputId))
    ),
    tags$script(
      HTML(
        whisker::whisker.render(
          template = '$("#{{id}}").ionRangeSlider({
          type: "{{data-type}}",
          from: {{data-from}},
          to: {{data-to}},
          grid: {{data-grid}},
          keyboard: true,
          keyboard_step: 1,
          postfix: {{data-postfix}},
          prefix: {{data-prefix}},
          drag_interval: {{data-drag-interval}},
          values: [{{data-values}}],
          disable: {{data-disable}}
          });',
          data = sliderProps
      )
      ))
      )
  if (identical(animate, TRUE)) 
    animate <- animationOptions()
  if (!is.null(animate) && !identical(animate, FALSE)) {
    if (is.null(animate$playButton)) 
      animate$playButton <- icon("play", lib = "glyphicon")
    if (is.null(animate$pauseButton)) 
      animate$pauseButton <- icon("pause", lib = "glyphicon")
    sliderTag <- htmltools::tagAppendChild(
      sliderTag,
      tags$div(class = "slider-animate-container", 
               tags$a(href = "#", class = "slider-animate-button", 
                      `data-target-id` = inputId, `data-interval` = animate$interval, 
                      `data-loop` = animate$loop, span(class = "play", 
                                                       animate$playButton), 
                      span(class = "pause", 
                           animate$pauseButton)))
    )
  }
  dep <- htmltools::htmlDependency(
    "ionrangeslider",
    "2.1.12",
    c(href = "shared/ionrangeslider"),
    script = "js/ion.rangeSlider.min.js",
    stylesheet = c(
      "css/ion.rangeSlider.css",
      "css/ion.rangeSlider.skinShiny.css"
    )
  )
  htmltools::attachDependencies(sliderTag, dep)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 闪亮的日期滑块动画(按月)(当前按天) 的相关文章

  • 简单的数据框重塑

    我刚刚从长时间的写作中断中回到 R 并且在记住如何重塑数据方面遇到了一些实际问题 我知道我想做的事情很容易 但出于某种原因 我今晚很愚蠢 并且将自己与融化和重塑混淆了 如果有人能快速指出我正确的方向 我将不胜感激 我有一个这样的数据框 pe
  • 在 R 中进行 Cox 回归后,将预测危险比列添加到数据帧中

    在 R 中运行 Cox PH 回归后 我需要在数据框中添加预测风险比的列 数据框是面板数据 其中 numgvkey 如果公司标识符 和年龄是时间标识符 您可以从此链接下载一小部分日期 https drive google com file
  • 从网络源获取 R 中的数据作为数据框

    我正在尝试使用 RCurl 包将一些空气污染背景数据作为 data frame 直接加载到 R 中 该网站有 3 个下拉框 用于在下载 csv 文件之前选择选项 如下图所示 我试图从下拉框中选择 3 个值 并使用 下载 CSV 按钮将数据作
  • 如何生成向量的所有组合[重复]

    这个问题在这里已经有答案了 假设我有 3 个绿球 2 个橙球和 8 个黄球 我想订购它们 鉴于所有相同颜色的球都是相同的 如何生成所有可能的序列 在 R 中 使用gregmisc 我可以 balls lt c orange orange g
  • 如何调整ggplot直方图的时间刻度轴

    我正在使用一个数据框 其中一列包含POSIXct日期时间值 我正在尝试使用绘制这些时间戳的直方图ggplot2但我有两个问题 我不知道如何设置 binwidthgeom histogram 我想将每个垃圾箱设置为一天或一周 我尝试提供 di
  • 分离并重新附加“tools:rstudio”

    又名玩火 以下不起作用 rstd obj lt as environment tools rstudio detach tools rstudio attach rstd obj name tools rstudio 好吧 它似乎有效 但随
  • 在函数内部调用 clusterApply 时,性能会下降

    我遇到了一个奇怪的问题clusterApply 我已经能够尽可能地隔离它 如下所示 首先 我从全局环境运行以下代码 require parallel cl lt makeCluster rep localhost 20 SOCK xl lt
  • 如何更新条件公式?

    让我直接进入示例 考虑以下等式 frml lt formula y a b x z 使用这样的公式规范 例如和AER ivreg 我想更新这个公式 使其显示为 frml2 lt y a b c x z w 但是 我不确定如何更新条件标志之前
  • 查找数据帧列表中同一列中的所有重复值并将其转换为 NULL

    我有一个清单BELGIAN COAST list包含数百个数据帧 df1 df2 15 列 X 1000 行 每个数据帧的最后一列称为Chemicals并包含一些字符 例如Sulfate or Ammonia 但是这一列有很多行Chemic
  • 限制数据框中所有单元格的字符串长度?

    您好 有没有一种方法可以限制 data frame 中所有列的字符串文本大小 而不必循环遍历每一列并一次使用 str trunc 之类的东西 例如下面的数据框 我可以将所有文本大小限制为仅 5 个字符 而不必一次只执行一列吗 如果有 50
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 在另一个 Rmd 中运行选定的块

    我已经在源 Rmd 文件中运行了分析 并且希望仅使用few来自源的块 我已经看到了一些关于从源 Rmd 中提取所有块的答案来自另一个 Rmd 中的 Rmd 文件的源代码 https stackoverflow com questions 4
  • 将数据从 R 导出到 Excel

    我试图将从 R 获得的一些结果导出到 Excel 中 但未成功 我尝试过以下代码 write table ALBERTA1 D ALBERTA1 txt sep t write csv ALBERTA1 ALBERTA1 csv your
  • 解析,用三点参数替换

    让我们考虑一个典型的deparse substitute R call f1 lt function u x y print deparse substitute x varU vu varX vx varY vy f1 u varU x
  • 如何将此“for”循环转换为向量解

    这个问题与 将嵌入其他文本的长州名称转换为两个字母的州缩写 https stackoverflow com questions 25582518 convert long state names embedded with other te
  • glmnet 未从 cv.glmnet 收敛 lambda.min

    我跑了20倍cv glmnet套索模型以获得 lambda 的 最佳 值 但是 当我尝试重现结果时glmnet 我收到一个错误 内容如下 Warning messages 1 from glmnet Fortran code error c
  • R:表格格式

    我有一个包含以下列的 Excel 文件 Column1 Column2 Column3 ab bb 0 5 ab bc 0 1 ab cd 0 7 ab dd 0 8 ac bb 0 2 ac bg 0 8 ac ee 0 8 ac dd
  • 为什么这些数字不相等?

    下面的代码显然是错误的 有什么问题 i lt 0 1 i lt i 0 05 i 1 0 15 if i 0 15 cat i equals 0 15 else cat i does not equal 0 15 i does not eq
  • 使用outer代替expand.grid

    我正在寻找尽可能快的速度并留在基地做该做的事expand grid做 我用过outer为过去类似的目的创建一个向量 像这样的东西 v lt outer letters LETTERS paste0 unlist v lower tri v
  • 替换字符串/文本中“从第 n 次到最后一次”出现的单词

    这个问题以前曾被问过 但尚未得到令提问者满意的答案 https stackoverflow com questions 36368712 how to use stringrs replace all function to replace

随机推荐

  • 如何使用 ruamel.yaml 在 Python 中的 YAML 中插入注释行?

    我有一个像这样的结构 我想使用添加注释行ruamel yaml xyz a 1 comment 1 b 2 test1 test2 test3 3 现在 我想插入注释行 不是 eol comments 使其看起来像这样 xyz a 1 co
  • 自行订阅PropertyChanged还是setter中添加方法调用?

    也许这里已经有这样的问题 但我没有找到 我有 MVVM 应用程序 并且在我的ViewModel我必须对某些属性的更改执行一些额外的操作 例如 如果View改变它们 您认为哪种方法更好 为什么 1 添加AdditionalAction调用设置
  • 为listview设置长按监听器

    我有以下代码 public class MainActivity extends ListActivity protected void onCreate Bundle savedInstanceState super onCreate s
  • JDK8 LocalDate.toEpochDay 性能奇怪下降

    我很好奇我们是否最终能使用 JDK8 获得一个快速的日期时间库 几乎所有LocalDate计算使用toEpochDay所以我看了看source大量的部门和分支机构让我很好奇我是否可以做得更好 我消除了一些分支和除一个分支之外的所有分支 但是
  • 如何告诉 Gradle 使用特定的 JDK 版本?

    我不知道如何让它发挥作用 设想 我有一个用 gradle 构建的应用程序 该应用程序使用JavaFX 我想要的是 使用一个变量 每个开发人员机器定义 该变量指向 JDK 的安装 该 JDK 将用于构建整个应用程序 测试 我想过拥有gradl
  • 比较 SQL Server 2005 中 DateTime 数据类型的时间部分

    如何在 SQL Server 2005 中仅比较 DateTime 数据类型的时间部分 例如 我想获取 MyDateField 在特定时间之后的所有记录 下面的示例是一个非常长且可能不快的方法 我想要 MyDateField 大于 12 3
  • 是否可以使用正则表达式在 MySQL 中强制执行数据检查

    假设我有一个名为电话号码的属性 并且我想对该字段的条目强制执行一定的有效性 我可以使用正则表达式来实现此目的 因为正则表达式在定义约束方面非常灵活 是的你可以 MySQL 支持正则表达式 http dev mysql com doc ref
  • iPhone 上的大多数游戏都是用 OpenGL ES 完成的吗?

    我只是想知道 iPhone 上的大多数游戏是否都是在 OpenGL ES 中完成的 而不是使用 Quartz 和 Core Animation Quartz 和 Core Animation 主要用于创建流畅的界面吗 或者 在游戏中是否存在
  • 如何从 .exe 文件中删除用 Python 编写的 .exe 文件?

    我正在尝试创建一个脚本 将 github 存储库克隆到当前目录中 然后删除调用它的脚本 该脚本是用Python 3 7 4编写的 并编译成 exe 我尝试过使用os remove sys argv 0 它在编译之前有效 但不适用于我的最终应
  • UIDocumentInteractionController 退出时崩溃

    我的主菜单上有一个常规的 UIButton 当前启动了一个 UIViewController 对应的 m文件内容如下 id initWithNibName NSString nibNameOrNil bundle NSBundle nibB
  • 在同一个 C++ 项目中链接两个不同版本的 protobuf 库

    我可以在同一个 C 项目中使用 protobuf 2 6 和 3 0 库并将它们链接在一起吗 您不能将两个不同版本的 libprotobuf 链接到同一个程序中 在某些操作系统上可能可行 但在 Linux 上肯定行不通 因为 Linux 上
  • 如何在 nunjucks 中定义全局变量?

    Using nunjucks 如何定义一些应始终在所有模板中可用的全局变量 理想情况下 它们将在环境或配置选项中的某个位置指定 并且不必在每次调用时合并到上下文字典中nunjucksEnvironment render 这可能对某人也有帮助
  • 如何在您的网站上显示 WordPress RSS feed?

    您好 我有一个网站和一个博客 我想在我的网站上显示我的自托管 WordPress 博客 我只想在我的网站上显示 3 个帖子 我想每次重新加载网站时自动检查是否有新帖子 以便仅显示最近的三个帖子 我想显示我的 WordPress 博客文章的完
  • 为什么axios get方法请求发送两次?

    I run the axios get method to call php script but request send twice how to solve this problem myfunction axios get http
  • 为什么 C# 时分号无法放置在 OracleCommand 的 CommandText 中

    Why 分号 无法放入命令文本OracleCommand 的时候C 就像下面这样 string sql select from table1 OracleCommand oc new OracleCommand sql con oc Com
  • 当 SendMessage 和 Perform 需要 NativeUInt 时,我应该如何将负值传递给它们?

    假设你有这样的代码 Result X ACustomMemo Perform EM LINEFROMCHAR 1 0 Windows API 声称 1 是一个有效值 使其返回活动行 然而 Delphi 将此定义为 NaiveUInt 并且如
  • Java异常处理的良好实践[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我对 Java 中的异常处
  • 云代码 Parse.User.current() 返回 null

    当我在 Cloud Code 中使用此函数时Parse User current return null 我在用着parseExpressCookieSession用于登录 有什么建议吗 var express require expres
  • 3d 整数坐标的哈希函数

    拥有 3D 统一网格 为了节省大型模型中的内存 不需要保存空单元格 不与任何对象重叠的单元格 为此 我在 C 中使用字典 尽管性能已经下降 但这仍然比创建 3D 网格时出现异常要好 现在我的问题是找到一个快速哈希函数 将网格的 3d 整数坐
  • R 闪亮的日期滑块动画(按月)(当前按天)

    我对 R 比较满意 对 Shiny 则不太满意 尽管这不是我的第一个 Shiny 应用程序 我有一个数据框 其中包含经 纬度以及每个新客户进入系统的日期 时间 我还根据 startDate 变量创建了其他变量 例如年 月 周 年月 ym 和