@@ -954,10 +954,10 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale,
954954 transform = identity ,
955955
956956 map = function (self , x , limits = self $ get_limits()) {
957- limits <- limits [ ! is.na(limits )]
958- n <- length (limits )
957+ limits <- vec_slice( limits , ! is.na(limits ))
958+ n <- vec_size (limits )
959959 if (n < 1 ) {
960- return (rep (self $ na.value , length (x )))
960+ return (vec_rep (self $ na.value , vec_size (x )))
961961 }
962962 if (! is.null(self $ n.breaks.cache ) && self $ n.breaks.cache == n ) {
963963 pal <- self $ palette.cache
@@ -973,21 +973,30 @@ ScaleDiscrete <- ggproto("ScaleDiscrete", Scale,
973973 self $ n.breaks.cache <- n
974974 }
975975
976- na_value <- if (self $ na.translate ) self $ na.value else NA
977- pal_names <- names(pal )
976+ na_value <- NA
977+ if (self $ na.translate ) {
978+ na_value <- self $ na.value
979+ if (obj_is_list(pal ) && ! obj_is_list(na_value )) {
980+ # We prevent a casting error that occurs when mapping grid patterns
981+ na_value <- list (na_value )
982+ }
983+ }
984+
985+ pal_names <- vec_names(pal )
978986
979987 if (! is_null(pal_names )) {
980988 # if pal is named, limit the pal by the names first,
981989 # then limit the values by the pal
982- pal [ is.na(match(pal_names , limits ))] <- na_value
983- pal <- unname (pal )
990+ vec_slice( pal , is.na(match(pal_names , limits ))) <- na_value
991+ pal <- vec_set_names (pal , NULL )
984992 limits <- pal_names
985993 }
986- pal <- c(pal , na_value )
987- pal_match <- pal [match(as.character(x ), limits , nomatch = length(pal ))]
994+ pal <- vec_c(pal , na_value )
995+ pal_match <-
996+ vec_slice(pal , match(as.character(x ), limits , nomatch = vec_size(pal )))
988997
989998 if (! is.na(na_value )) {
990- pal_match [ is.na(x )] <- na_value
999+ vec_slice( pal_match , is.na(x )) <- na_value
9911000 }
9921001 pal_match
9931002 },
0 commit comments