Just before the 2022 Christmas, we finally fulfilled a knitr request from 2018 by Hugh Parsonage (thanks, Hugh). That is, remove the stringr dependency in knitr. The original motivation was to make it faster to install knitr, since stringr depends on stringi, which is a relatively heavy dependency and can take quite some time to compile. This motivation is no longer that strong because it has become easier to install prebuilt binaries of stringi later (e.g., via the Posit Package Manager).
Anyway, I’m always in favor of fewer dependencies if possible, especially for infrastructure packages that are widely used. Last year when I saw Deepayan’s work in base R using knitr to run examples and demos on R help pages, I was a little concerned that knitr might be too heavy for this task.
It turned out that knitr’s dependency on stringr was not too tight. The
functions were mostly straightforward to be replaced by base R functions like
gsub(), substr(), gregexpr(), and regmatches(), so we have done that.
With stringr gone, it means knitr has also removed seven indirect dependencies (see the dependency graphs below). Only four hard dependencies are left. The dependency on highr could be removed, too, because it is used only for syntax highlighting in Rnw documents, but it’s quite lightweight, and I’m not sure if it’s worth bothering Rnw users and asking them to install highr explicitly (probably not).
knitr (<= v1.41)
|> evaluate
|> highr
|> stringr
|> cli
|> glue
|> lifecycle
|> magrittr
|> rlang
|> stringi
|> vctrs
|> yaml
|> xfun
knitr (> v1.41)
|> evaluate
|> highr
|> yaml
|> xfun
Now one thing left for us to figure out is whether this will affect the performance much. I feel the impact should be trivial, because the most time-consuming part in knitting is often evaluating the code chunks, rather than parsing the document. Anyway, we will do the benchmarking next, and update this post with the results accordingly. In the meantime, please feel free to try it out by yourself and let us know if you notice any performance issues:
install.packages('knitr', repos = c(
yihui = 'https://yihui.r-universe.dev',
CRAN = 'https://cloud.r-project.org'
))
Thanks!
- Update on 2023-01-19
-
We (mainly @cderv) have finished benchmarking and you can read a report here. Some of our base R functions are faster than stringr equivalents, and some are slower. Overall I don’t have any concerns on the slower functions, because 1) some of them are used in processing
.Rnwdocuments only, and 2) the absolute time of one function call is often less than one millisecond, which shouldn’t be noticeable even if it is 3 or 4 times slower.
Donate
As a freelancer (currently working as a contractor) and a dad of three kids, I truly appreciate your donation to support my writing and open-source software development! Your contribution helps me cope with financial uncertainty better, so I can spend more time on producing high-quality content and software. You can make a donation through methods below.
-
Venmo:
@yihui_xie, or Zelle:xie@yihui.name -
Paypal
-
If you have a Paypal account, you can follow the link https://paypal.me/YihuiXie or find me on Paypal via my email
xie@yihui.name. Please choose the payment type as “Family and Friends” (instead of “Goods and Services”) to avoid extra fees. -
If you don’t have Paypal, you may donate through this link via your debit or credit card. Paypal will charge a fee on my side.
-
-
Other ways:
WeChat Pay (微信支付:谢益辉) Alipay (支付宝:谢益辉) 

When sending money, please be sure to add a note “gift” or “donation” if possible, so it won’t be treated as my taxable income but a genuine gift. Needless to say, donation is completely voluntary and I appreciate any amount you can give.
Please feel free to email me if you prefer a different way to give. Thank you very much!
I’ll give back a significant portion of the donations to the open-source community and charities. For the record, I received about $30,000 in total (before tax) in 2024-25, and gave back about $15,000 (after tax).