1# For R, size is Lebesgue measure, so closure is irrelevant. Note that we don't 2# use the close_intervals method here, which is important since this method 3# requires empty, and empty currently uses size. We need to avoid circular 4# dependency. 5 6setGeneric( "size", def = function( x, ... ) standardGeneric( "size" ) ) 7 8setMethod( 9 "size", 10 signature( "Intervals" ), 11 function( x, as = type(x) ) { 12 result <- x[,2] - x[,1] 13 if ( as == "Z" ) { 14 ties <- x[,2] == x[,1] 15 ties[ is.na( ties ) ] <- FALSE 16 result[ ties ] <- ifelse( all( closed(x) ), 1, 0 ) 17 result[ !ties ] <- result[ !ties ] + sum( closed(x) ) - 1 # NAs just stay NA 18 } 19 return( result ) 20 } 21 ) 22 23setMethod( 24 "size", 25 signature( "Intervals_full" ), 26 function( x, as = type(x) ) { 27 result <- x[,2] - x[,1] 28 if ( as == "Z" ) { 29 ties <- x[,2] == x[,1] 30 ties[ is.na( ties ) ] <- FALSE 31 rs <- rowSums( closed(x) ) 32 result[ ties ] <- ifelse( rs[ ties ] == 2, 1, 0 ) 33 result[ !ties ] <- result[ !ties ] + rs[ !ties ] - 1 34 } 35 return( result ) 36 } 37 ) 38