plotly / plotly/plotly.R

plotly failures with dev rlang

Ouverte
#2,488 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
R
Étoiles
2.7k
Forks
641
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

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.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

L’échec est couvert par tests/testthat/test-ggplot-legend.R, et les titres des guides sont assemblés dans ggplotly.R autour des lignes 1071-1072. Commencez par exécuter le test en échec avec la version dev de rlang et examinez comment l’ordre des guides est déterminé. C’est terminé lorsque le test du titre de la légende réussit avec un ordre déterministe avec la version mise à jour de rlang.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
r
Domaine
data-visualization, testing
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
55/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.