plotly / plotly/plotly.R

HTML documents including plotly plots are not reproducible

Offen
#2,074 1 Kommentar 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
R
Sterne
2.7k
Forks
641
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

I believe it is known that the value of plotly::plot_ly(x = 1, y = 1)$x$cur_data is hard to reproduce, compare https://github.com/plotly/plotly.R/issues/1048. Some work has been done in #1379 towards use in shinytest at least.

I am also using shinytest, but in my app, users are downloading HTML files with plotly plots generated using rmarkdown::render(). So these files are still non-reproducible because I cannot seem to use renderPlotly() inside rmarkdown::render(). To see the problem:

bug.Rmd:

---
output: html_document
---

```{r}
plotly::plot_ly(x = 1, y = 1)
```

Then run R -q -s -e 'rmarkdown::render("bug.Rmd")' and see the value of cur_data in bug.html change every time you regenerate it.

I see two options:

  • I could replicate the logic of
    https://github.com/plotly/plotly.R/blob/bab01af316673e35d8314129178bfb27eed27fe7/R/shiny.R#L46-L53
    inside bug.Rmd, like this:
    p <- plotly::plot_ly(x = 1, y = 1)
    p$x$attrs <- NULL # and a few more
    p
    
    However, this breaks the plot. Any way I can make this work?
  • I have also tried putting this inside bug.Rmd:
    shiny::snapshotPreprocessOutput(
      plotly::plot_ly(x = 1, y = 1),
      function(value) {
        # https://github.com/plotly/plotly.R/blob/3d49fbc5897703d58b/R/shiny.R#L68
        json <- jsonlite::from_JSON(value)
        json$x <- json$x[setdiff(names(json$x), c("visdat", "cur_data", "attrs"))]
        # https://github.com/plotly/plotly.R/blob/3d49fbc589/R/utils.R#L1020-L1025
        jsonlite::toJSON(json,
          digits = 50, auto_unbox = TRUE, force = TRUE,
          null = "null", na = "null", time_format = "%Y-%m-%d %H:%M:%OS6"
        )
      }
    )
    
    but rmarkdown::render() seemed to ignore it, even inside shinytest (or did I do anything wrong there)?
  • One could amend #1365 to take into account a hash of the current plot serialization to avoid generating identical IDs even if the external seed is reset to the same values externally. This would avoid the need for tempfile().

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere das Problem mit bug.Rmd und R -q -s -e 'rmarkdown::render("bug.Rmd")', und vergleiche anschließend den Wert von cur_data in bug.html über mehrere Render-Vorgänge hinweg. Lies die referenzierte Logik in R/shiny.R und R/utils.R sowie die zugehörigen Issues #1048, #1379 und #1365. Als erledigt gilt, wenn mit rmarkdown::render() gerenderte HTML-Dokumente reproduzierbare Plotdaten erzeugen, ohne den Plot zu beschädigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, r
Bereich
data-visualization, web-dev
Issue-Typ
Bug
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.