@@ -963,10 +963,10 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale,
963963 transform = identity ,
964964
965965 map = function (self , x , limits = self $ get_limits()) {
966- limits <- limits [ ! is.na(limits )]
967- n <- length (limits )
966+ limits <- vec_slice( limits , ! is.na(limits ))
967+ n <- vec_size (limits )
968968 if (n < 1 ) {
969- return (rep (self $ na.value , length (x )))
969+ return (vec_rep (self $ na.value , vec_size (x )))
970970 }
971971 if (! is.null(self $ n.breaks.cache ) && self $ n.breaks.cache == n ) {
972972 pal <- self $ palette.cache
@@ -982,21 +982,30 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale,
982982 self $ n.breaks.cache <- n
983983 }
984984
985- na_value <- if (self $ na.translate ) self $ na.value else NA
986- pal_names <- names(pal )
985+ na_value <- NA
986+ if (self $ na.translate ) {
987+ na_value <- self $ na.value
988+ if (obj_is_list(pal ) && ! obj_is_list(na_value )) {
989+ # We prevent a casting error that occurs when mapping grid patterns
990+ na_value <- list (na_value )
991+ }
992+ }
993+
994+ pal_names <- vec_names(pal )
987995
988996 if (! is_null(pal_names )) {
989997 # if pal is named, limit the pal by the names first,
990998 # then limit the values by the pal
991- pal [ is.na(match(pal_names , limits ))] <- na_value
992- pal <- unname (pal )
999+ vec_slice( pal , is.na(match(pal_names , limits ))) <- na_value
1000+ pal <- vec_set_names (pal , NULL )
9931001 limits <- pal_names
9941002 }
995- pal <- c(pal , na_value )
996- pal_match <- pal [match(as.character(x ), limits , nomatch = length(pal ))]
1003+ pal <- vec_c(pal , na_value )
1004+ pal_match <-
1005+ vec_slice(pal , match(as.character(x ), limits , nomatch = vec_size(pal )))
9971006
9981007 if (! is.na(na_value )) {
999- pal_match [ is.na(x )] <- na_value
1008+ vec_slice( pal_match , is.na(x )) <- na_value
10001009 }
10011010 pal_match
10021011 },
0 commit comments