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,
Mike
require(IRanges)
STRATA <- 1:40
s1 <- sample(STRATA, 1)
for (i in seq(from = 1, to = 39, by = 1)){
repeat{
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)
}
s1
The simple thing to do is to put a sanity counter in the 'repeat' statement and if you have been through it a certain number of times, then exit. Anytime you have a loop that might run forever, you should have some sanity/watchdog timer on it. On Tue, Mar 22, 2011 at 11:02 AM, Hosack, Michael <mhosack at state.pa.us> wrote:> 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, > > Mike > > require(IRanges) > STRATA <- 1:40 > s1 <- sample(STRATA, 1) > for (i in seq(from = 1, to = 39, by = 1)){ > ?repeat{ > ? ?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) > } > s1 > > ______________________________________________ > 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. >-- Jim Holtman Data Munger Guru What is the problem that you are trying to solve?
Hi,
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
break
}
}
if (found) break
if (iter > 100) {
cat("Giving up\n")
break
}
}
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.
Martyn
-----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,
Mike
require(IRanges)
STRATA <- 1:40
s1 <- sample(STRATA, 1)
for (i in seq(from = 1, to = 39, by = 1)){
repeat{
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)
}
s1
______________________________________________
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.
________________________________________________________________________
This e-mail has been scanned for all viruses by Star.\ _...{{dropped:12}}