Finally, a use for rapply
apply family of functions,
rapply is the unloved ginger stepchild. While
vapply make regular appearances in my code, and
tapply have occasional cameo appearances, in ten years of R coding, I’ve never once found a good use for
Maybe once a year I take a look at the help page, decide it looks to complicated, and ignore the function again. So today I was very pleased to have found a genuine use for the function. It isn’t life-changing, but it’s quite cute.
Complex classes often have a print method that hides their internals. For example, regression models created by
glm are lists with thirty elements, but their print method displays only the call, the coefficients and a few statistics.
# From example(glm) utils::data(anorexia, package = "MASS") anorex.1 <- glm(Postwt ~ Prewt + Treat + offset(Prewt), family = gaussian, data = anorexia) str(anorex.1)
To see everything, you need to use
unclass(anorex.1) #many pages of output
unclass has a limitation: it only removes the top level class, so subelements keep their classes. For example, compare:
class(unclass(anorex.1)$qr) # qr class(unclass(anorex.1$qr)) # list
rapply, we can remove classes throughout the whole of the object, turning it into a list of simple objects.
rapply(anorex.1, unclass, how = "replace")
As well as allowing us to thoroughly inspect the contents of the object, it also allows the object to be used with other code that doesn’t understand particular classes.