[R] Infinite loop

Hosack, Michael mhosack at state.pa.us
Tue Mar 22 18:56:14 CET 2011

Thank you so much Martyn. Now I can most likely avoid having to rerun my program 
multiple times.


-----Original Message-----
From: Martyn Byng [mailto:Martyn.Byng at nag.co.uk] 
Sent: Tuesday, March 22, 2011 1:21 PM
To: Hosack, Michael
Cc: r-help at R-project.org
Subject: RE: [R] Infinite loop


This might do what you want:

iter <- 0
repeat {
  iter <- iter + 1
  ss <- numeric(40)
  ss[1] <- sample(1:40,1)
  for (i in 1:39) {
    ## calculate all possible step sizes that will give a new value in
the 1:40 range
    pmove <- sample((1 - ss[i]):(40-ss[i]))
    ## drop all step sizes that puts the new value within 7 places of
the previous value
    pmove <- pmove[abs(pmove)>7]
    ## calculate potential next values
    pss <- pmove + ss[i]
    ## flag any values that are already in the sample
    not.already.in <- !(pss%in%ss)
    found <- any(not.already.in)
    if (found) {
      ## use the first value that is not already in the sample
      ss[i+1] <- pss[not.already.in][1]
    } else {
      ## all potential values are already in the sample, so choose
another starting point
  if (found) break
  if (iter > 100) {
    cat("Giving up\n")

It randomly chooses a starting value, then chooses the next value based
on a randomly selected step size rather than directly. It keeps doing
this until it either uses all possible values, or gets stuck in which
case it randomly selects another starting value. If it can't find a
solution in 100 goes it gives up.


-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org]
On Behalf Of Hosack, Michael
Sent: 22 March 2011 15:03
To: r-help at R-project.org
Subject: [R] Infinite loop

R experts,

Hello, I am trying to sample a vector 1:40 without replacement such that
no element in the new vector 
is within 7 units of either of its immediate neighbors. This is part of
a larger program I am working 
on. The following code works well about 65 % of the time (14/40). The
problem I encounter happens when 
the last element remaining to be sampled from the vector STRATA is
within 7 digits +- of the last element 
in the vector s1, at which point an infinite loop occurs. At least
that's what I think is happening. 
Any help would be greatly appreciated. 

Thank you,


STRATA <- 1:40
s1 <- sample(STRATA, 1)
for (i in seq(from = 1, to = 39, by = 1)){
    tmp <- sample(STRATA, 1)
    if (!any(s1 == tmp) & !any(as.vector(IRanges(s1[length(s1)]-7,
s1[length(s1)]+7)) %in% tmp)) break
  s1 <- c(s1,tmp)

R-help at r-project.org mailing list
PLEASE do read the posting guide
and provide commented, minimal, self-contained, reproducible code.

This e-mail has been scanned for all viruses by Star.\ _...{{dropped:12}}

More information about the R-help mailing list