Dear lists, any suggestion on how to write a function to return a TRUE if interval [a,b] overlaps the interval [c,d]. I've tried it but an error occur saying that 'could not find function v ; in addition warning message occur'. Below is my codes.Please help me sort this problem as i'm in process of learning of writing a function. Many thanks overlap<-function(m,n){ t=length(m) v=length(n) tt=logical(t) tv=logical(v) for(i in 1:m){ for(i in 1:n){ if(v(i,j)<=t(i,j)){ tt=T tv=T } } } k=c(tt,tv) return(k) } Regards, Anisah --------------------------------- [[alternative HTML version deleted]]
Hi, mohamed nur anisah wrote:> Dear lists, > > any suggestion on how to write a function to return a TRUE if interval [a,b] overlaps the interval [c,d]. I've tried it but an error occur saying that 'could not find function v ; in addition warning message occur'. Below is my codes.Please help me sort this problem as i'm in process of learning of writing a function. Many thanksdoes this do what you want? overlap <- function(a,b,c,d) { all(c:d %in% a:b) } overlap(1,5,3,4) overlap(1,2,3,4) Best, Roland> > overlap<-function(m,n){ > t=length(m) > v=length(n) > tt=logical(t) > tv=logical(v) > for(i in 1:m){ > for(i in 1:n){ > if(v(i,j)<=t(i,j)){ > tt=T > tv=T > } > } > } > k=c(tt,tv) > return(k) > } > > Regards, > Anisah > > > --------------------------------- > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
Your code looks like matlab, but I don't see how it would work even there. The specific problem is the to refer to an array, you do so with square brackets [..] and not round ones, (though your v is not an array, anyway, so your troubles are just starting). Let's tackle what I think may be your problem directly. You say you want to know if the interval (a,b) overlaps (c,d) or not. OK, suppose a, b, c and d are four vectors defining intervals (a[i],b[i]) and (c[i],d[i]), and you want a vector of logicals as the result. Here is a suggestion. overlap <- function(a, b, c, d) !((pmax(a, b) < pmin(c, d)) | (pmax(c, d) < pmin(a, b))) Here is a little demo> set.seed(2008) > w <- runif(10) > x <- runif(10) > y <- runif(10) > z <- runif(10) > o <- overlap(w, x, y, z) > data.frame(a=w, b=x, c=y, d=z, o)a b c d o 1 0.5711326 0.32063318 0.02002140 0.3581223 TRUE 2 0.6422710 0.09871573 0.02017792 0.6659485 TRUE 3 0.4645480 0.38348609 0.57137732 0.5682764 FALSE 4 0.8695450 0.99505570 0.78598674 0.8700771 TRUE 5 0.6338629 0.62817830 0.03717119 0.6008403 FALSE 6 0.3897689 0.34575269 0.70860446 0.7215733 FALSE 7 0.5236651 0.91862887 0.27005734 0.6000776 TRUE 8 0.7730075 0.02215747 0.76042526 0.9626952 TRUE 9 0.6267855 0.64686826 0.81222122 0.6340692 TRUE 10 0.1752022 0.66873049 0.58638984 0.1629897 TRUE>Bill Venables CSIRO Laboratories PO Box 120, Cleveland, 4163 AUSTRALIA Office Phone (email preferred): +61 7 3826 7251 Fax (if absolutely necessary): +61 7 3826 7304 Mobile: +61 4 8819 4402 Home Phone: +61 7 3286 7700 mailto:Bill.Venables at csiro.au http://www.cmis.csiro.au/bill.venables/ -----Original Message----- From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of mohamed nur anisah Sent: Thursday, 14 February 2008 12:22 AM To: r-help at r-project.org Subject: [R] writing a simple function Dear lists, any suggestion on how to write a function to return a TRUE if interval [a,b] overlaps the interval [c,d]. I've tried it but an error occur saying that 'could not find function v ; in addition warning message occur'. Below is my codes.Please help me sort this problem as i'm in process of learning of writing a function. Many thanks overlap<-function(m,n){ t=length(m) v=length(n) tt=logical(t) tv=logical(v) for(i in 1:m){ for(i in 1:n){ if(v(i,j)<=t(i,j)){ tt=T tv=T } } } k=c(tt,tv) return(k) } Regards, Anisah --------------------------------- [[alternative HTML version deleted]] ______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
Roland Rau <roland.rproject <at> gmail.com> writes:> > does this do what you want? > > overlap <- function(a,b,c,d) { > all(c:d %in% a:b) > } > overlap(1,5,3,4) > overlap(1,2,3,4)Do you really want this to be discrete? How about overlap <- function(a,b,c,d) { a<c && b>d } (although this assumes that a<b and c<d ...)
Hi, Ben Bolker wrote:> Roland Rau <roland.rproject <at> gmail.com> writes: > >> does this do what you want? >> >> overlap <- function(a,b,c,d) { >> all(c:d %in% a:b) >> } >> overlap(1,5,3,4) >> overlap(1,2,3,4) > > Do you really want this to be discrete? How about > > overlap <- function(a,b,c,d) { > a<c && b>d > }you are absolutely right.[1] I assume with discrete you mean integers? I think the bigger problem with my function is that it makes way too many comparisons than are actually necessary (memory and time problems). What about the following function: overlap <- function(intval1, intval2) { (min(intval1) < min(intval2)) && (max(intval1) > max(intval2)) } Best, Roland [1] I realized the problems with my solution almost as soon as I sent the email. But I was on a way to a meeting and there was no more time to correct it at that moment.