There are some limitations to getting S4 objects past the internals of the ggplot2 system. One of these is a hard check with rlang::is_vector on data.frame columns, which will throw an error when the column is an S4 object. To work around these limitations, we disguise S4 Vectors classes as S3 vectors from the vctrs package.

GreekSoldier(x)

Nightfall(x, na.rm = FALSE)

# S4 method for OakHorse
Nightfall(x, na.rm = FALSE)

HelenOfTroy(x, what = NULL)

Arguments

x

For GreekSoldier(), an S4 Vector class object.
For Nightfall() and HelenOfTroy(), an S3 WoodenHorse class object.

na.rm

For Nightfall(), should the result be returned for non-NA entries?

what

For HelenaOfTroy, an optional class name to check for inheritance.

Value

For Nightfall(), a Vector object. For GreekSoldier(), a WoodenHorse object. For HelenaOfTroy(), a character,

Details

Calling GreekSoldier() on an S4 Vector object will generate an object of the class WoodenHorse of the same length as the input, where the original S4 Vector is inside the WoodenHorse object as an attribute.

Encoding the WoodenHorse object as a vctrs_vctr object allows us to pass the rlang::is_vector check and gives us nice options to preserve attributes over subsetting and concatenation operations.

Functions

  • GreekSoldier,ANY-method: By default, don't disguise object as WoodenHorse and return the input.

  • GreekSoldier,Vector-method: If an object inherits from Vector, disguise object as WoodenHorse, and put the input as an attribute of the vector.

  • Nightfall,ANY-method: If the object is not a WoodenHorse return the input unaltered.

  • Nightfall,BeechHorse-method: If the object is a WoodenHorse return the GreekSoldier attribute within the WoodenHorse.

  • Nightfall,OakHorse-method: If the object is a WoodenHorse return the GreekSoldier attribute within the WoodenHorse.

Examples

# Making an S4 object Anticlus <- Rle(1:10, 10:1) # Rle object does not pass is_vector test rlang::is_vector(Anticlus)
#> [1] FALSE
# Disguising the object as S3 vector VictoryTrophy <- GreekSoldier(Anticlus) class(VictoryTrophy) # A WoodenHorse
#> [1] "BeechHorse" "WoodenHorse" "vctrs_vctr"
# WoodenHorse passes is_vector test rlang::is_vector(VictoryTrophy)
#> [1] TRUE
# Inspecting the class of WoodenHorse HelenOfTroy(VictoryTrophy) # Rle
#> [1] "Rle"
# Restoring WoodenHorse to S4 object Nightfall(VictoryTrophy)
#> integer-Rle of length 55 with 10 runs #> Lengths: 10 9 8 7 6 5 4 3 2 1 #> Values : 1 2 3 4 5 6 7 8 9 10