微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

串扰:在启动时更改情节图

如何解决串扰:在启动时更改情节图

我正在尝试通过 plotly 文档中的 crosstalk 更改 Rmarkdown 图表。这在原则上工作正常,但是,我想通过 JavaScript 将下拉列表设置为启动时的第一个元素。但是,此更改不会更新图表。如果我在渲染整个页面后运行相同的代码,或者使用延迟,它会起作用。

因此,我假设在更新 JavaScript 运行时,plotly 图形尚未呈现。 setTimeout 解决方案有效,但这感觉很hackis。那么,通知 plotly/crosstalk 输入已更改的规范方式是什么?

在 gif 中,您会看到在启动时,绘图显示了完整范围,只有在更改为 b 之后,然后更改为 a 后才相应地更新了图表。我希望图表在启动时已经正确过滤。

代码

---
title: "Delay Plotly"
date: "1 2 2021"
output: html_document
---

```{r setup,include=FALSE}
knitr::opts_chunk$set(echo = FALSE,message = FALSE)
```
```{r libs}
library(crosstalk)
library(plotly)
```

```{r gen-data}
set.seed(1)
mdat <- data.frame(x = rep(LETTERS[1:6],6),y = sample(100,36,TRUE),fill = factor(rep(rep(1:3,each = 6),2)),grp = rep(letters[1:2],each = 18),id = paste0("id",1:36),stringsAsFactors = FALSE)
sd <- SharedData$new(mdat,key = ~ id)

```

```{js}
$(function() {
   // set dropdown to first element
   // setTimeout(function() { // uncomment for workaround
      $('.selectized').each(function(idx,el) {
         const sel = this.selectize;
         const options = Object.keys(sel.options);
         sel.setValue(options[0]);
      });
   // },1000); // uncomment for workaround
})
```


```{r}
bscols(
   filter_select("grp","Group:",sd,~ grp,multiple = FALSE),plot_ly(sd) %>%
      add_trace(x = ~ x,y = ~ y,type = "bar",color = ~ fill,marker = list(line = list(color = "white",width = 1)) ## add border to see the 2 groups
                ) %>%
      layout(barmode = "stack"))
```

Graph is not updated

解决方法

更顺畅的解决方法是使用 window.onload 钩子。这避免了指定超时延迟的需要,与 $.ready 相比,不是在加载 DOM 后而是在整个页面准备就绪后触发。正是我需要的,除非 plotly 中有一个专门用于此类操作的钩子? plotly_afterplot 似乎是合适的人选。然而,这在 $.ready

上不可用
window.onload = function() {
   // set dropdown to first element
   $('.selectized').each(function(idx,el) {
      const sel = this.selectize;
      const options = Object.keys(sel.options);
      sel.setValue(options[0]);
   });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。