In R there are many ways to skin a cat...
For example
animals %>%
.[ , "cats"] %>%
str()
is also a legit syntax, giving the same outcome as pull(cats) and .$cats.
The question about preferring one over the other is more about your (or your team's) coding style than about one approach being right and the other wrong.
So do what you will, but please, please, be consistent 
library(dplyr)
animals <- data.frame(cats = 1:10,
dogs = 10:1)
base1 <- animals %>%
.[, "cats"]
base2 <- animals %>%
.$cats
dplyr <- animals %>%
pull(cats)