Navigating CRAN’s Reverse Dependency Check Logs

Yihui Xie 2026-02-09

Note

This post is unlikely to be useful for most people, so please feel free to skip it unless you maintain an R package that has a lot of reverse dependencies.

The number of reverse dependencies of the knitr package (and rmarkdown) reached 10,000 a couple of years ago, about which I have mixed feelings. On one hand, it’s great that so many packages depend on knitr and rmarkdown; on the other hand, it means checking reverse dependencies becomes a more and more daunting task.

One problem is, with this many reverse dependencies, CRAN’s reverse dependency check will almost surely find false positive problems. Every single time I submit a new version of knitr or rmarkdown to CRAN, I’ll receive a report telling me that they failed certain packages. Sometimes the logs can run thousands of lines! The log looks like this:

Package: lwqs
Check: re-building of vignette outputs
New result: ERROR
  Error(s) in re-building vignettes:
    ...
  --- re-building ‘lwqs-vignette.Rmd’ using rmarkdown
  
  
  Quitting from lwqs-vignette.Rmd:201-219 [unnamed-chunk-8]
  Execution halted

Package: NeEDS4BigData
Check: tests
New result: ERROR
    Running ‘spelling.R’ [0s/0s]
....

It’s a huge pain to scan through the logs and find out which packages are really broken by me. I’m sure that some problems are not my fault, like this one (connectivity issues):

Package: tsfeatures
Check: examples
New result: ERROR
  Running examples in ‘tsfeatures-Ex.R’ failed
  
  trying URL 'https://github.com/robjhyndman/tsfeatures/raw/master/extra-data/yahoo.rda'
  Warning in utils::download.file("https://github.com/robjhyndman/tsfeatures/raw/master/extra-data/yahoo.rda",  :
    cannot open URL 'https://github.com/robjhyndman/tsfeatures/raw/master/extra-data/yahoo.rda': HTTP status was '504 Gateway Timeout'
  Execution halted

However, I still have to read through all logs to be sure.

In 2024, I couldn’t stand this anymore, so I wrote a small JS snippet to transform these logs into tabsets. The script splits the text at each Package: marker and wraps the results in tab structures. Each tab shows one package name (with a link to its CRAN check page) and its log output.

To use the JS snippet, you can open the log (here’s an example log) in a browser and copy/paste the JS code into the browser console. The page transforms from a wall of text into organized tabs. Instead of scrolling through the entire log, I can click a tab and see what went wrong with each package without being overwhelmed by the sheer volume of logs.

The JS snippet was essentially a quick regex exercise and built on top of the minimal tabset implementation that I created in 2023.