ggshakeR maintenance status
The last tagged release of ggshakeR is 0.1.2 from March 2022, with a
dev version (0.2.0.9002) on GitHub that has not seen meaningful updates
since 2023. In practice this means the package has not kept up with the
current ggplot2 / tidyverse line, and that led
to a concrete blocker in this document.
Since ggplot2 4.0 (released 2025), ggplot objects use the S7 object
system rather than the older S3 one. ggshakeR’s internal plotting
functions were written against the S3 behaviour, and the result in a
current setup (ggplot2 4.0.2 + ggshakeR 0.2.0.9002) is that functions
like plot_heatmap() return a valid ggplot object, but
adding layers on top or printing the plot in a knitted document silently
fails and produces an empty render. No error, just a blank figure. It
only became obvious when I compared nrow() of the filtered
data (200+ rows) with class() of the returned plot (which
contained S7_object).
This is why Example 3 falls back to raw ggplot2 +
ggsoccer: the manual version works regardless of ggplot2’s
object system. The same class of issue would likely hit most other
ggshakeR pitch-plot functions until the package is updated for S7.
plot_shot() and plot_passnet() happened to
still render in my tests, but I would not rely on any ggshakeR function
surviving a ggplot2 update without checking the output carefully.
If you need ggshakeR to behave like the documentation describes, the
practical options are pinning ggplot2 to the 3.5.x line with
devtools::install_version("ggplot2", "3.5.1"), or treating
ggshakeR as a reference for how these charts can be structured and then
building them manually with ggplot2 + ggsoccer.
FBref and Understat scraping restrictions
ggshakeR also supports FBref (via worldfootballR) and
Understat (via understatr). Both are worth knowing about,
but both have tightened access recently. FBref returns HTTP 403 under
higher request rates, and Understat currently blocks automated scraping
entirely. This came up while preparing this document, and other students
in the cohort ran into the same issue. For anything that needs to knit
reliably, StatsBomb is the safer choice because the data comes straight
from GitHub.