Created on 2017-12-15 by the reprex package (v0.1.1.9000).
The non-core members of the tidyverse are installed by
install.packages("tidyverse")
but are not attached. Though the "membership" has changed, you can read here for what makes tidyverse packages part of a coherent system.
Packages, such as cli (since you mentioned it), tidyselect, and crayon are part of what's called r-lib. While the tidyverse consists of highly-opinionated tools for data science; r-lib contains mostly-unopinionated infrastructure tools. Their specific uses differ, but, for the most part, r-lib packages are not something the average R user will need. They're more for development, testing, and are utilized by the tidyverse packages (e.g. tidyselect provides backend of functions like dplyr::select() or dplyr::pull() as well as several tidyr verbs) and other activities more akin to programming with R.
Thanks for the useful infomation! Especially, the role of r-lib is what I didn't know.
But, still I don't get the meaning of "core". I know core packages are attached, but why are they so special? What is the differences between the cores and non-cores?
For example, stringr and forcats moved to core on version 1.2.0. Why? Is this because the package got matured enough? If so, what criteria did they achieve? Since, as you said, the membership changes as time goes by, I'm very curious about the rule behind the tidyverse...
@mara will have the inside track on the decisions made by the Rstudio team, but from a user's perspective adding stringr and forecats to core tidyverse makes sense to me because I wind up needing to load them most of the time anyway.
As for why the other core packages are "core" tidyverse, I think it's because they each contribute to an essential activity in data exploration. Below if from http://r4ds.had.co.nz/explore-intro.html.
I said the membership has changed ! The tidyverse package/wrapper has only been around for about a year (see its CRAN package archive). I don't think the plan is for it to be changing continually. The core packages are the ones people use most for the basic pipeline, as @ryanthomas pointed to below. I don't know of a hard and fast rule, I don't think there is one (@hadley?). Given its an admittedly opinionated set of tools, I'd say that the why is part of that opinion (which isn't to say it's arbitrary, but there's no case_when() or if_else() rule to write out fot it).
We moved stringr and forcats into core because they provide a bunch of functions that you use all the time (because you almost always have strings and factors to work with).
The real question is why isn't lubridate in core? The answer is that it currently conflicts (in a narrow sense) with too many base functions - in practice the lubridate functions extend or wrap the base alternatives so the conflict aren't harmful in practice, but I haven't had time to think through how this should be indicated in the tidyverse loading screen.