library(tulaverse)Tulaverse
The R code for nearly all of the pages will make some use of a package called tulaverse. At the beginning of the pages, when packages are loaded, you will usually see the code include:
Later on these pages, you might see the functions tula() or tulatab(), as well as, in the plots, theme_tula(). These are part of tulaverse.
But you won’t see tulaverse in code examples you find online or have it used in code generated by AI. This is because I wrote it.
Why does tulaverse exist?
The tulaverse functions are mostly me addressing cases where R output doesn’t look the way I think it ought to look or doesn’t include information I think it ought to include. It also sometimes simplifies how to get certain quantities in R output when I think the standard R way is more complicated than it should be.
The way tula() formats output is not a clone of Stata, but the inspiration of Stata is unmistakable. There are many reasons people may prefer using R to Stata, but anybody who says R has better output than Stata is either lying or a cultist. (For example, the fact that R’s regression output does not explicitly indicate the number of observations is an atrocity.)
How to install tulaverse
I don’t care if you use tulaverse, although you’ll have to modify my code examples if you want them to work directly without it.
I have not yet traversed the hurdles needed to publish tulaverse on CRAN, so you cannot install it with install.packages() the way you can with the other packages in the course. Instead, if you install the remotes package, you can install it like this: is different because I wrote it and have not yet published it on CRAN. To install it, you can use the remotes package, which allows you to install packages from GitHub. You can install remotes with install.packages("remotes"). Then you can install tulaverse with the following:
install.packages("remotes") # not required if you have installed remotes already
remotes::install_github("jeremyfreese/tulaverse")How was tulaverse written?
tulaverse is 100% vibecoded using Claude Code. That is, I have not written one line of the underlying code for it. By this point, it’s a matter of principle. If there was a problem and I knew I could fix it by changing one line of the code myself, I would still prompt Claude Code until it figured out how to fix it.
Why the name “tulaverse”?
The “-verse” is a play on tidyverse, which is a very popular suite of packages that is invoked at the top of practically every bit of R code I provide.
But why “tula()”? When I was writing the function, I wanted a short name and thought of various fun possibilities. Invariably when I googled, I found the name was already taken by some other R package or other significant internet/computing thing that might invite confusion.
“tula()” was the first idea that did not have this problem. Tula was a rabbit of ours; she already had the name when we adopted her from the rabbit rescue. She was a treasure.
