plotly failures with dev rlang
未关闭
还没有人认领这个 Issue。
- 主要语言
- R
- 星标
- 2.7k
- 派生
- 641
- PR 合并指标
- 30 天内没有已合并 PR
描述
I'm seeing failures for plotly with dev rlang:
Running ‘testthat.R’
Running the tests in ‘tests/testthat.R’ failed.
Complete output:
> library("testthat")
> library("plotly")
Loading required package: ggplot2
Attaching package: 'plotly'
The following object is masked from 'package:ggplot2':
...
Expected `legend_title` to match regexp "factor\\(cyl\\)$".
Actual text:
✖ │ factor(cyl)<br />factor(vs)
[ FAIL 2 | WARN 23 | SKIP 63 | PASS 1449 ]
Deleting unused snapshots: 'ggplot-contour/contour.svg' and
'ggplot-heatmap/heatmap.svg'
Error:
! Test failures.
Execution halted
Claude traced this to rlang::hash() producing different hashes in the new version (which was deliberate to fix other stability issues see https://github.com/r-lib/rlang/issues/1681#issuecomment-4267291605):
The chain is:
1. rlang dev changed hash() values (commit 229db8154 — "Stable hash()"). The NEWS says: "with this version all hash values will now be different". This is intentional for cross-R-version
stability.
2. ggplot2's Guides$merge sorts by hash. In Guides$merge(), each guide gets a key {order}_{hash} and then split(pairs, hashes) is called. R's split() returns groups in alphabetical order
of factor levels. So the final guide order depends on the alphabetical sort of the hash strings.
3. plotly concatenates guide titles in order. At ggplotly.R:1071-1072:
legendTitles <- compact(lapply(gdefs, function(g) if (inherits(g, "legend")) g$title else NULL))
legendTitle <- paste(legendTitles, collapse = br())
4. The plotly test asserts a specific order (test-ggplot-legend.R:32-33):
expect_match(legend_title, "^factor\\(vs\\)") # vs first
expect_match(legend_title, "factor\\(cyl\\)$") # cyl last
With CRAN rlang, the hashes sort as 99_124c... (vs) < 99_4d3... (cyl) → title = factor(vs)<br />factor(cyl).
With dev rlang, the hashes sort as 99_aefe... (cyl) < 99_ebf7... (vs) → title = factor(cyl)<br />factor(vs).
I've talked to the ggplot2 maintainers and they recommend using the order argument to make guide placement deterministic. Claude also suggests this fix (unverified):
diff --git a/tests/testthat/test-ggplot-legend.R b/tests/testthat/test-ggplot-legend.R
index 9dd92ea..d1d97e5 100644
--- a/tests/testthat/test-ggplot-legend.R
+++ b/tests/testthat/test-ggplot-legend.R
@@ -29,8 +29,8 @@ test_that("Discrete colour and shape get merged into one legend", {
nms, paste0("(", d$vs, ",", d$cyl, ")")
)
legend_title <- info$layout$legend$title$text
- expect_match(legend_title, "^factor\\(vs\\)")
- expect_match(legend_title, "factor\\(cyl\\)$")
+ expect_match(legend_title, "factor\\(vs\\)")
+ expect_match(legend_title, "factor\\(cyl\\)")
})
As a heads up, I'm planning to release this rlang update within the next two weeks.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
该失败由 tests/testthat/test-ggplot-legend.R 覆盖,guide 标题在 ggplotly.R 的 1071-1072 行附近组装。首先使用 dev 版 rlang 运行失败的测试,并检查 guide 顺序是如何确定的。在更新后的 rlang 下,legend title 测试以确定性的顺序通过即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- r
- 领域
- data-visualization, testing
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 55/100