Wie ermittle ich den Geom-Typ für jeden Layer eines ggplot2-Objekts?

Im Rahmen der Bemühungen, ein bestimmtes Geom aus einem bereits erstellten Grundstück zu entfernen (SO LinkHier) Möchte ich den Geom-Typ jedes Layers eines ggplot2-Objekts dynamisch bestimmen.

Angenommen, ich kenne die Reihenfolge, in der ich Layer hinzugefügt habe, nicht. Gibt es eine Möglichkeit, Layer mit einem bestimmten Geom dynamisch zu finden? Wenn ich die Ebenen wie folgt drucke, sehe ich, dass die Ebenen in einer Liste gespeichert sind, aber ich kann scheinbar nicht auf den Geom-Typ zugreifen.

library(ggplot2)
dat <- data.frame(x=1:3, y=1:3, ymin=0:2, ymax=2:4)
p <- ggplot(dat, aes(x=x, y=y)) + geom_ribbon(aes(ymin=ymin, ymax=ymax), alpha=0.3) + geom_line()
p$layers

[[1]]
mapping: ymin = ymin, ymax = ymax 
geom_ribbon: na.rm = FALSE, alpha = 0.3 
stat_identity:  
position_identity: (width = NULL, height = NULL)

[[2]]
geom_line:  
stat_identity:  
position_identity: (width = NULL, height = NULL)

Ich kenne mich nicht mit Proto-Objekten und Dingen aus, die ich mit dem Proto ausprobiert habeDokumentation scheinen nicht zu funktionieren (z.p$layers[[1]]$str()).

Dank der folgenden Antworten konnte ich eine Funktion entwickeln, die eine Ebene dynamisch entfernt:

remove_geom <- function(ggplot2_object, geom_type) {
  layers <- lapply(ggplot2_object$layers, function(x) if(x$geom$objname == geom_type) NULL else x)
  layers <- layers[!sapply(layers, is.null)]

  ggplot2_object$layers <- layers
  ggplot2_object
}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage