@@ -483,7 +483,7 @@ element_grob.element_point <- function(element, x = 0.5, y = 0.5, colour = NULL,
483
483
# ' # plot panels. To do so, it registers a new theme element `ggxyz.panel.annotation`
484
484
# ' register_theme_elements(
485
485
# ' ggxyz.panel.annotation = element_text(color = "blue", hjust = 0.95, vjust = 0.05),
486
- # ' element_tree = list(ggxyz.panel.annotation = el_def(" element_text" , "text"))
486
+ # ' element_tree = list(ggxyz.panel.annotation = el_def(element_text, "text"))
487
487
# ' )
488
488
# '
489
489
# ' # Now the package can define a new coord that includes a panel annotation
@@ -602,8 +602,8 @@ check_element_tree <- function(x, arg = caller_arg(x), call = caller_env()) {
602
602
# ' @details
603
603
# ' The function `el_def()` is used to define new or modified element types and
604
604
# ' element inheritance relationships for the element tree.
605
- # ' @param class The name of the element class. Examples are " element_line" or
606
- # ' " element_text" or "unit", or one of the two reserved keywords "character" or
605
+ # ' @param class The name of the element class. Examples are ` element_line` or
606
+ # ' ` element_text` or "unit", or one of the two reserved keywords "character" or
607
607
# ' "margin". The reserved keyword "character" implies a character
608
608
# ' or numeric vector, not a class called "character". The keyword
609
609
# ' "margin" implies a unit vector of length 4, as created by [margin()].
@@ -622,43 +622,43 @@ el_def <- function(class = NULL, inherit = NULL, description = NULL) {
622
622
# among them. It should not be read from directly, since users may modify the
623
623
# current element tree stored in ggplot_global$element_tree
624
624
.element_tree <- list (
625
- line = el_def(" element_line" ),
626
- rect = el_def(" element_rect" ),
627
- text = el_def(" element_text" ),
628
- point = el_def(" element_point" ),
629
- polygon = el_def(" element_polygon" ),
630
- geom = el_def(" element_geom" ),
631
- title = el_def(" element_text" , " text" ),
625
+ line = el_def(element_line ),
626
+ rect = el_def(element_rect ),
627
+ text = el_def(element_text ),
628
+ point = el_def(element_point ),
629
+ polygon = el_def(element_polygon ),
630
+ geom = el_def(element_geom ),
631
+ title = el_def(element_text , " text" ),
632
632
spacing = el_def(" unit" ),
633
633
margins = el_def(c(" margin" , " unit" )),
634
634
635
- axis.line = el_def(" element_line" , " line" ),
636
- axis.text = el_def(" element_text" , " text" ),
637
- axis.title = el_def(" element_text" , " title" ),
638
- axis.ticks = el_def(" element_line" , " line" ),
635
+ axis.line = el_def(element_line , " line" ),
636
+ axis.text = el_def(element_text , " text" ),
637
+ axis.title = el_def(element_text , " title" ),
638
+ axis.ticks = el_def(element_line , " line" ),
639
639
legend.key.size = el_def(c(" unit" , " rel" ), " spacing" ),
640
- panel.grid = el_def(" element_line" , " line" ),
641
- panel.grid.major = el_def(" element_line" , " panel.grid" ),
642
- panel.grid.minor = el_def(" element_line" , " panel.grid" ),
643
- strip.text = el_def(" element_text" , " text" ),
644
-
645
- axis.line.x = el_def(" element_line" , " axis.line" ),
646
- axis.line.x.top = el_def(" element_line" , " axis.line.x" ),
647
- axis.line.x.bottom = el_def(" element_line" , " axis.line.x" ),
648
- axis.line.y = el_def(" element_line" , " axis.line" ),
649
- axis.line.y.left = el_def(" element_line" , " axis.line.y" ),
650
- axis.line.y.right = el_def(" element_line" , " axis.line.y" ),
651
- axis.line.theta = el_def(" element_line" , " axis.line.x" ),
652
- axis.line.r = el_def(" element_line" , " axis.line.y" ),
653
-
654
- axis.text.x = el_def(" element_text" , " axis.text" ),
655
- axis.text.x.top = el_def(" element_text" , " axis.text.x" ),
656
- axis.text.x.bottom = el_def(" element_text" , " axis.text.x" ),
657
- axis.text.y = el_def(" element_text" , " axis.text" ),
658
- axis.text.y.left = el_def(" element_text" , " axis.text.y" ),
659
- axis.text.y.right = el_def(" element_text" , " axis.text.y" ),
660
- axis.text.theta = el_def(" element_text" , " axis.text.x" ),
661
- axis.text.r = el_def(" element_text" , " axis.text.y" ),
640
+ panel.grid = el_def(element_line , " line" ),
641
+ panel.grid.major = el_def(element_line , " panel.grid" ),
642
+ panel.grid.minor = el_def(element_line , " panel.grid" ),
643
+ strip.text = el_def(element_text , " text" ),
644
+
645
+ axis.line.x = el_def(element_line , " axis.line" ),
646
+ axis.line.x.top = el_def(element_line , " axis.line.x" ),
647
+ axis.line.x.bottom = el_def(element_line , " axis.line.x" ),
648
+ axis.line.y = el_def(element_line , " axis.line" ),
649
+ axis.line.y.left = el_def(element_line , " axis.line.y" ),
650
+ axis.line.y.right = el_def(element_line , " axis.line.y" ),
651
+ axis.line.theta = el_def(element_line , " axis.line.x" ),
652
+ axis.line.r = el_def(element_line , " axis.line.y" ),
653
+
654
+ axis.text.x = el_def(element_text , " axis.text" ),
655
+ axis.text.x.top = el_def(element_text , " axis.text.x" ),
656
+ axis.text.x.bottom = el_def(element_text , " axis.text.x" ),
657
+ axis.text.y = el_def(element_text , " axis.text" ),
658
+ axis.text.y.left = el_def(element_text , " axis.text.y" ),
659
+ axis.text.y.right = el_def(element_text , " axis.text.y" ),
660
+ axis.text.theta = el_def(element_text , " axis.text.x" ),
661
+ axis.text.r = el_def(element_text , " axis.text.y" ),
662
662
663
663
axis.ticks.length = el_def(c(" unit" , " rel" ), " spacing" ),
664
664
axis.ticks.length.x = el_def(c(" unit" , " rel" ), " axis.ticks.length" ),
@@ -670,28 +670,28 @@ el_def <- function(class = NULL, inherit = NULL, description = NULL) {
670
670
axis.ticks.length.theta = el_def(c(" unit" , " rel" ), " axis.ticks.length.x" ),
671
671
axis.ticks.length.r = el_def(c(" unit" , " rel" ), " axis.ticks.length.y" ),
672
672
673
- axis.ticks.x = el_def(" element_line" , " axis.ticks" ),
674
- axis.ticks.x.top = el_def(" element_line" , " axis.ticks.x" ),
675
- axis.ticks.x.bottom = el_def(" element_line" , " axis.ticks.x" ),
676
- axis.ticks.y = el_def(" element_line" , " axis.ticks" ),
677
- axis.ticks.y.left = el_def(" element_line" , " axis.ticks.y" ),
678
- axis.ticks.y.right = el_def(" element_line" , " axis.ticks.y" ),
679
- axis.ticks.theta = el_def(" element_line" , " axis.ticks.x" ),
680
- axis.ticks.r = el_def(" element_line" , " axis.ticks.y" ),
681
-
682
- axis.title.x = el_def(" element_text" , " axis.title" ),
683
- axis.title.x.top = el_def(" element_text" , " axis.title.x" ),
684
- axis.title.x.bottom = el_def(" element_text" , " axis.title.x" ),
685
- axis.title.y = el_def(" element_text" , " axis.title" ),
686
- axis.title.y.left = el_def(" element_text" , " axis.title.y" ),
687
- axis.title.y.right = el_def(" element_text" , " axis.title.y" ),
688
-
689
- axis.minor.ticks.x.top = el_def(" element_line" , " axis.ticks.x.top" ),
690
- axis.minor.ticks.x.bottom = el_def(" element_line" , " axis.ticks.x.bottom" ),
691
- axis.minor.ticks.y.left = el_def(" element_line" , " axis.ticks.y.left" ),
692
- axis.minor.ticks.y.right = el_def(" element_line" , " axis.ticks.y.right" ),
693
- axis.minor.ticks.theta = el_def(" element_line" , " axis.ticks.theta" ),
694
- axis.minor.ticks.r = el_def(" element_line" , " axis.ticks.r" ),
673
+ axis.ticks.x = el_def(element_line , " axis.ticks" ),
674
+ axis.ticks.x.top = el_def(element_line , " axis.ticks.x" ),
675
+ axis.ticks.x.bottom = el_def(element_line , " axis.ticks.x" ),
676
+ axis.ticks.y = el_def(element_line , " axis.ticks" ),
677
+ axis.ticks.y.left = el_def(element_line , " axis.ticks.y" ),
678
+ axis.ticks.y.right = el_def(element_line , " axis.ticks.y" ),
679
+ axis.ticks.theta = el_def(element_line , " axis.ticks.x" ),
680
+ axis.ticks.r = el_def(element_line , " axis.ticks.y" ),
681
+
682
+ axis.title.x = el_def(element_text , " axis.title" ),
683
+ axis.title.x.top = el_def(element_text , " axis.title.x" ),
684
+ axis.title.x.bottom = el_def(element_text , " axis.title.x" ),
685
+ axis.title.y = el_def(element_text , " axis.title" ),
686
+ axis.title.y.left = el_def(element_text , " axis.title.y" ),
687
+ axis.title.y.right = el_def(element_text , " axis.title.y" ),
688
+
689
+ axis.minor.ticks.x.top = el_def(element_line , " axis.ticks.x.top" ),
690
+ axis.minor.ticks.x.bottom = el_def(element_line , " axis.ticks.x.bottom" ),
691
+ axis.minor.ticks.y.left = el_def(element_line , " axis.ticks.y.left" ),
692
+ axis.minor.ticks.y.right = el_def(element_line , " axis.ticks.y.right" ),
693
+ axis.minor.ticks.theta = el_def(element_line , " axis.ticks.theta" ),
694
+ axis.minor.ticks.r = el_def(element_line , " axis.ticks.r" ),
695
695
696
696
axis.minor.ticks.length = el_def(c(" unit" , " rel" )),
697
697
axis.minor.ticks.length.x = el_def(c(" unit" , " rel" ), " axis.minor.ticks.length" ),
@@ -715,25 +715,25 @@ el_def <- function(class = NULL, inherit = NULL, description = NULL) {
715
715
c(" unit" , " rel" ), c(" axis.minor.ticks.length.y" , " axis.ticks.length.r" )
716
716
),
717
717
718
- legend.background = el_def(" element_rect" , " rect" ),
718
+ legend.background = el_def(element_rect , " rect" ),
719
719
legend.margin = el_def(c(" margin" , " unit" , " rel" ), " margins" ),
720
720
legend.spacing = el_def(c(" unit" , " rel" ), " spacing" ),
721
721
legend.spacing.x = el_def(c(" unit" , " rel" ), " legend.spacing" ),
722
722
legend.spacing.y = el_def(c(" unit" , " rel" ), " legend.spacing" ),
723
- legend.key = el_def(" element_rect" , " panel.background" ),
723
+ legend.key = el_def(element_rect , " panel.background" ),
724
724
legend.key.height = el_def(c(" unit" , " rel" ), " legend.key.size" ),
725
725
legend.key.width = el_def(c(" unit" , " rel" ), " legend.key.size" ),
726
726
legend.key.spacing = el_def(c(" unit" , " rel" ), " spacing" ),
727
727
legend.key.spacing.x = el_def(c(" unit" , " rel" ), " legend.key.spacing" ),
728
728
legend.key.spacing.y = el_def(c(" unit" , " rel" ), " legend.key.spacing" ),
729
729
legend.key.justification = el_def(c(" character" , " numeric" , " integer" )),
730
- legend.frame = el_def(" element_rect" , " rect" ),
731
- legend.axis.line = el_def(" element_line" , " line" ),
732
- legend.ticks = el_def(" element_line" , " legend.axis.line" ),
730
+ legend.frame = el_def(element_rect , " rect" ),
731
+ legend.axis.line = el_def(element_line , " line" ),
732
+ legend.ticks = el_def(element_line , " legend.axis.line" ),
733
733
legend.ticks.length = el_def(c(" rel" , " unit" ), " legend.key.size" ),
734
- legend.text = el_def(" element_text" , " text" ),
734
+ legend.text = el_def(element_text , " text" ),
735
735
legend.text.position = el_def(" character" ),
736
- legend.title = el_def(" element_text" , " title" ),
736
+ legend.title = el_def(element_text , " title" ),
737
737
legend.title.position = el_def(" character" ),
738
738
legend.byrow = el_def(" logical" ),
739
739
legend.position = el_def(" character" ),
@@ -767,45 +767,45 @@ el_def <- function(class = NULL, inherit = NULL, description = NULL) {
767
767
legend.box = el_def(" character" ),
768
768
legend.box.just = el_def(" character" ),
769
769
legend.box.margin = el_def(c(" margin" , " unit" , " rel" ), " margins" ),
770
- legend.box.background = el_def(" element_rect" , " rect" ),
770
+ legend.box.background = el_def(element_rect , " rect" ),
771
771
legend.box.spacing = el_def(c(" unit" , " rel" ), " spacing" ),
772
772
773
- panel.background = el_def(" element_rect" , " rect" ),
774
- panel.border = el_def(" element_rect" , " rect" ),
773
+ panel.background = el_def(element_rect , " rect" ),
774
+ panel.border = el_def(element_rect , " rect" ),
775
775
panel.spacing = el_def(c(" unit" , " rel" ), " spacing" ),
776
776
panel.spacing.x = el_def(c(" unit" , " rel" ), " panel.spacing" ),
777
777
panel.spacing.y = el_def(c(" unit" , " rel" ), " panel.spacing" ),
778
- panel.grid.major.x = el_def(" element_line" , " panel.grid.major" ),
779
- panel.grid.major.y = el_def(" element_line" , " panel.grid.major" ),
780
- panel.grid.minor.x = el_def(" element_line" , " panel.grid.minor" ),
781
- panel.grid.minor.y = el_def(" element_line" , " panel.grid.minor" ),
778
+ panel.grid.major.x = el_def(element_line , " panel.grid.major" ),
779
+ panel.grid.major.y = el_def(element_line , " panel.grid.major" ),
780
+ panel.grid.minor.x = el_def(element_line , " panel.grid.minor" ),
781
+ panel.grid.minor.y = el_def(element_line , " panel.grid.minor" ),
782
782
panel.ontop = el_def(" logical" ),
783
783
panel.widths = el_def(" unit" ),
784
784
panel.heights = el_def(" unit" ),
785
785
786
- strip.background = el_def(" element_rect" , " rect" ),
787
- strip.background.x = el_def(" element_rect" , " strip.background" ),
788
- strip.background.y = el_def(" element_rect" , " strip.background" ),
786
+ strip.background = el_def(element_rect , " rect" ),
787
+ strip.background.x = el_def(element_rect , " strip.background" ),
788
+ strip.background.y = el_def(element_rect , " strip.background" ),
789
789
strip.clip = el_def(" character" ),
790
- strip.text.x = el_def(" element_text" , " strip.text" ),
791
- strip.text.x.top = el_def(" element_text" , " strip.text.x" ),
792
- strip.text.x.bottom = el_def(" element_text" , " strip.text.x" ),
793
- strip.text.y = el_def(" element_text" , " strip.text" ),
794
- strip.text.y.left = el_def(" element_text" , " strip.text.y" ),
795
- strip.text.y.right = el_def(" element_text" , " strip.text.y" ),
790
+ strip.text.x = el_def(element_text , " strip.text" ),
791
+ strip.text.x.top = el_def(element_text , " strip.text.x" ),
792
+ strip.text.x.bottom = el_def(element_text , " strip.text.x" ),
793
+ strip.text.y = el_def(element_text , " strip.text" ),
794
+ strip.text.y.left = el_def(element_text , " strip.text.y" ),
795
+ strip.text.y.right = el_def(element_text , " strip.text.y" ),
796
796
strip.placement = el_def(" character" ),
797
797
strip.placement.x = el_def(" character" , " strip.placement" ),
798
798
strip.placement.y = el_def(" character" , " strip.placement" ),
799
799
strip.switch.pad.grid = el_def(c(" unit" , " rel" ), " spacing" ),
800
800
strip.switch.pad.wrap = el_def(c(" unit" , " rel" ), " spacing" ),
801
801
802
- plot.background = el_def(" element_rect" , " rect" ),
803
- plot.title = el_def(" element_text" , " title" ),
802
+ plot.background = el_def(element_rect , " rect" ),
803
+ plot.title = el_def(element_text , " title" ),
804
804
plot.title.position = el_def(" character" ),
805
- plot.subtitle = el_def(" element_text" , " text" ),
806
- plot.caption = el_def(" element_text" , " text" ),
805
+ plot.subtitle = el_def(element_text , " text" ),
806
+ plot.caption = el_def(element_text , " text" ),
807
807
plot.caption.position = el_def(" character" ),
808
- plot.tag = el_def(" element_text" , " text" ),
808
+ plot.tag = el_def(element_text , " text" ),
809
809
plot.tag.position = el_def(c(" character" , " numeric" , " integer" )), # Need to also accept numbers
810
810
plot.tag.location = el_def(" character" ),
811
811
plot.margin = el_def(c(" margin" , " unit" , " rel" ), " margins" ),
@@ -849,11 +849,18 @@ check_element <- function(el, elname, element_tree, call = caller_env()) {
849
849
850
850
# NULL values for elements are OK
851
851
if (is.null(el )) return ()
852
+ class <- eldef $ class
853
+ if (inherits(class , " S7_class" ) && S7 :: S7_inherits(el )) {
854
+ if (S7 :: S7_inherits(el , class ) ||
855
+ (S7 :: S7_inherits(el , element ) && S7 :: S7_inherits(el , element_blank ))) {
856
+ return ()
857
+ }
858
+ }
852
859
853
- if (" margin" %in% eldef $ class ) {
860
+ if (" margin" %in% class ) {
854
861
if (! is.unit(el ) && length(el ) == 4 )
855
862
cli :: cli_abort(" The {.var {elname}} theme element must be a {.cls unit} vector of length 4." , call = call )
856
- } else if (! inherits(el , eldef $ class ) && ! inherits(el , " element_blank" )) {
863
+ } else if (! inherits(el , class ) && ! inherits(el , " element_blank" )) {
857
864
cli :: cli_abort(" The {.var {elname}} theme element must be a {.cls {eldef$class}} object." , call = call )
858
865
}
859
866
invisible ()
0 commit comments