メモ:ggplot2でGeomの直接の子クラスはいくつあるかを調べる

たとえば、GeomBarGeomRectの子クラスです。

class(GeomBar)
#> [1] "GeomBar"  "GeomRect" "Geom"     "ggproto"  "gg"

geomはいっぱいある感じするけど、実は内部的には10種類くらいだったりするのでは?という淡い期待を抱きつつ調べてみる。

library(ggplot2)

e <- as.environment('package:ggplot2')
geom_names <- ls(e, pattern = "^Geom")
geoms <- lapply(geom_names, get, e)

x <- purrr::keep(geoms, function(g) {
  # super() で親クラスを調べられる
  exists("super", g) && identical(is(g$super()), "Geom")
})

purrr::map_chr(x, is)
#>  [1] "GeomAbline"     "GeomBlank"      "GeomBoxplot"    "GeomCrossbar"  
#>  [5] "GeomCustomAnn"  "GeomDotplot"    "GeomErrorbar"   "GeomErrorbarh" 
#>  [9] "GeomHex"        "GeomHline"      "GeomLabel"      "GeomLinerange" 
#> [13] "GeomLogticks"   "GeomPath"       "GeomPoint"      "GeomPointrange"
#> [17] "GeomPolygon"    "GeomRaster"     "GeomRasterAnn"  "GeomRect"      
#> [21] "GeomRibbon"     "GeomRug"        "GeomSegment"    "GeomSf"        
#> [25] "GeomSmooth"     "GeomText"       "GeomViolin"     "GeomVline"

けっこうある。うーん...