使用R/Shiny时,为Timevis中的各个项目设置可编辑选项

okxuctiv  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(112)

我正在使用Timevis包在R/Shiny中创建一个时间线。我想为单个项目设置特定的可编辑性选项。有些项目应该可以在组之间移动(但不能在时间上移动),有些项目应该根本不可编辑。我确实发现了前面的问题:Setting editable options in Timevis when using R/Shiny?,但它没有提到如何设置个别项目的选项。
https://search.r-project.org/CRAN/refmans/timevis/html/timevis.html中,我发现底层的Javascript选项可以使用htmlwidgets::JS()命令来设置,使用这个命令我可以为整个时间轴设置选项,如下所示:

server <- function(input, output, session)
{
  
  # render timeline
  output$timeline <- renderTimevis({
    tv <- timevis( data = timevisData, groups = timevisDataGroups, options=list(editable = htmlwidgets::JS("{updateGroup: true, updateTime: false }")))
  })
  
  
  timevisDataGroups <- data.frame(id=c("group 1", "group 2"),
                                  content = c("Group 1", "Group 2")
  )
  
  timevisData <- data.frame(id = 1:2,
                            content = c("name 1", "name 2"),
                            start = c("2022-01-01", "2022-01-05"),
                            end = c("2022-01-03", "2022-01-06"),
                            group = c("group 1", "group 2"),
                            type = c("range", "range"))
  
}

但是,这并不允许我区分不同的项目,我试图设置个别项目的选项如下:

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

  # render timeline
  output$timeline <- renderTimevis({
    tv <- timevis( data = timevisData, groups = timevisDataGroups, options=list(editable = TRUE))
  })

  timevisDataGroups <- data.frame(id=c("group 1", "group 2"),
                                  content = c("Group 1", "Group 2")
  )

  timevisData <- data.frame(id = 1:2,
               content = c("name 1", "name 2"),
               start = c("2022-01-01", "2022-01-05"),
               end = c("2022-01-03", "2022-01-06"),
               group = c("group 1", "group 2"),
               options = c(htmlwidgets::JS("editable: {updateGroup: true, updateTime: false }"), htmlwidgets::JS("editable: {updateGroup: false, updateTime: false }")),
               type = c("range", "range"))
}

但是,特定于项目的选项似乎没有任何效果。

nhaq1z21

nhaq1z211#

我也陷入了类似的问题,我发现timevisaddItem函数是创建项目并将其添加到空timevis对象的替代方法。
从你的例子中得到启发:

timevisDataGroups <- data.frame(id = c("group 1", "group 2"),
                                content = c("Group 1", "Group 2"))

timevisData <- data.frame(
  id = 1:2,
  content = c("name 1", "name 2"),
  start = c("2022-01-01", "2022-01-05"),
  end = c("2022-01-03", "2022-01-06"),
  group = c("group 1", "group 2"),
  type = c("range", "range")
)

tv <- timevis::timevis(groups = timevisDataGroups,
                       options = list(
                         editable = list(
                           updateTime = FALSE, #set default 
                           updateGroup = TRUE, #set default 
                           overrideItems = FALSE #to allow item-specific configuration to override the default
                         )
                       )
) %>%
  timevis::addItem(
    apply(timevisData, 1, function(item) {
      editable = if(item["start"] < as.Date("2022-01-04")){
        editable = list(
          updateGroup = FALSE,
          updateTime = FALSE
        )
      } else {
        editable = list(
          updateGroup = TRUE,
          updateTime = FALSE
        )
      }
      as.list(c(item, list(editable = editable)))
    })
  ) %>%
  timevis::fitWindow()

使用addItem可以使用列表(而不是数据.frame)指定removeupdateGroupupdateTime参数来创建项目(请参阅timeline javascript文档:https://visjs.github.io/vis-timeline/docs/timeline/)使用我创建的item["start"] > as.Date("2022-01-04")规则,应该可以将 name 1 从一个组移动到另一个组。
注意:根据timeline R包文档,您应该可以在timevisData中添加一个名为“editable”的列来为每个条目指定editable(但不单独控制removeupdateGroupupdateTime的状态),但由于某种原因,它对我来说不起作用。

相关问题