@@ -97,11 +97,15 @@ ylim.gsplot <- function(object, side=NULL, set.undefined=TRUE){
9797# ' @export
9898lim <- function (object , side , axis , set.undefined , if .null ) UseMethod(" lim" )
9999
100- lim <- function (object , side = NULL , axis = NULL , set.undefined = TRUE , if .null = c(0 ,1 )){
101- side.names <- names(sides(object ))
102- if (! is.null(side ))
100+ # ' @export
101+ lim.gsplot <- function (object , side = NULL , axis = NULL , set.undefined = TRUE , if .null = c(0 ,1 )){
102+ all.side.names <- names(sides(object ))
103+ side.names <- all.side.names
104+ if (! is.null(side )) {
103105 side.names <- as.side_name(side )
104- else {
106+ side.axis <- as.axis(side )
107+ if (! is.null(axis ) && side.axis != axis ){ warning(paste(" side" , side , " does not have" , axis , " limits" ))}
108+ } else {
105109 if (! is.null(axis )){
106110 sides <- as.side(names(sides(object )))
107111 if (axis == ' y' )
@@ -113,31 +117,56 @@ lim <- function(object, side=NULL, axis = NULL, set.undefined=TRUE, if.null=c(0,
113117
114118 }
115119
116- lims <- lapply(side.names , function (x ) {
120+ lims <- lapply(all. side.names , function (x ) {
117121 lim <- object [[x ]]$ lim
118122 if (object [[x ]]$ reverse ){
119123 lim <- rev(lim )
120124 }
121125 return (lim )
122126 })
123- names(lims ) <- side.names
124- if (! is.null(side ) && length(side )== 1 ){
125- lims <- lims [[1 ]]
126- if (set.undefined && all(is.na(lims ))){
127- lims <- lim(object , axis = as.axis(side ))
128- sides <- as.side(names(lims )[sapply(lims , function (x ) ! any(is.na(x )))])
129- closest.side <- sides [which.min(abs(side - sides ))][1 ]
130- if (is.null(closest.side )){
131- lims <- NULL
132- } else {
133- lims <- lims [[as.side_name(closest.side )]]
127+ names(lims ) <- all.side.names
128+
129+ if (set.undefined ){
130+ # get names of all sides on the same axis (x or y) that are not completely NA
131+ which.undef <- sapply(lims , function (x ) all(is.na(x )))
132+ if (all(which.undef )){
133+ lims <- NULL
134+ } else {
135+ undef.sides <- as.side(all.side.names [which.undef ])
136+ def.sides <- as.side(all.side.names [! which.undef ])
137+ if (is.null(side ) || side %in% undef.sides ){
138+ for (tmp.side in undef.sides ){
139+ # find side closest to the undefined side (must be same axis)
140+ tmp.side.name <- as.side_name(tmp.side )
141+ tmp.lims <- lims [[tmp.side.name ]]
142+ def.sides.axis.match <- def.sides [as.axis(def.sides ) == as.axis(tmp.side )]
143+ closest.side <- def.sides.axis.match [which.min(abs(tmp.side - def.sides.axis.match ))]
144+ if (length(closest.side ) == 0 ){
145+ tmp.lims <- NULL
146+ } else {
147+ tmp.lims <- lims [[as.side_name(closest.side )]]
148+ match.reverse <- object [[tmp.side.name ]]$ reverse == object [[as.side_name(closest.side )]]$ reverse
149+ if (! match.reverse ){
150+ warning(paste(" undefined limits for side" , tmp.side ,
151+ " , cannot reverse; therefore, matching side" , closest.side ))
152+ }
153+ }
154+ lims [[tmp.side.name ]] <- tmp.lims
155+ }
134156 }
135157 }
136- if (is.null(lims )){
137- lims <- if .null
138- }
139158 }
140-
159+
160+ if (! is.null(lims ) && ! is.null(side ) && length(side )== 1 ){ # # move this to the end
161+ lims <- lims [[side.names ]]
162+ } else {
163+ lims <- lims [side.names ]
164+ }
165+
166+ if (is.null(lims )){
167+ lims <- if .null
168+ }
169+
141170 return (lims )
142171}
143172
0 commit comments