plotly / plotly/plotly.R

plotly failures with dev rlang

Aperta
#2,488 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
R
Stelle
2.7k
Fork
641
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

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.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Il fallimento è coperto da tests/testthat/test-ggplot-legend.R e i titoli delle guide vengono assemblati in ggplotly.R intorno alle righe 1071-1072. Inizia eseguendo il test che fallisce con la versione dev di rlang e analizza come viene determinato l’ordine delle guide. Il lavoro è completato quando il test del titolo della legenda passa con un ordinamento deterministico nella versione aggiornata di rlang.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
r
Ambito
data-visualization, testing
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
55/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.