Everyone,
I'm very new to R, especially when it comes to loops and functions, so
please bear with me if this is an elementary question. I cannot seem to
figure out how to construct a loop which runs a function until a certain
value is computed. For example, say I have the following:
num = numeric (10)
num [1] = 0
for (i in 2:10) {
num [i] = num [i-1] + 5
}
This adds 5 to the preceding spot of a vector of length 10 to get the value
in the current spot. However, say I don't just want to run this for 10
spots; rather I want to run it until a certain value (say, 100) is computed.
How I construct my loop to do this?
Thanks!
[[alternative HTML version deleted]]
You might want to use a while loop instead, something like:
while(TRUE){
# Do things
# Test: if your condition has occured
if(conditionHappened) break # break will end loop.
}
Michael
On Tue, Apr 10, 2012 at 10:48 AM, Steve Lavrenz
<stevelavrenz at hotmail.com> wrote:> Everyone,
>
> I'm very new to R, especially when it comes to loops and functions, so
> please bear with me if this is an elementary question. I cannot seem to
> figure out how to construct a loop which runs a function until a certain
> value is computed. For example, say I have the following:
>
> num = numeric (10)
> num [1] = 0
> for (i in 2:10) ? {
> ? ? ?num [i] = num [i-1] + 5
> }
>
> This adds 5 to the preceding spot of a vector of length 10 to get the value
> in the current spot. However, say I don't just want to run this for 10
> spots; rather I want to run it until a certain value (say, 100) is
computed.
> How I construct my loop to do this?
>
> Thanks!
>
>
> ? ? ? ?[[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.
http://cran.r-project.org/doc/manuals/R-lang.html#while
i<-2
while(value <=100){
num[i] <- num[i-1] +5
value <- num[i]
i <- i+1
}
something like this?
greetings Jessi
Am 10.04.2012 um 16:48 schrieb Steve Lavrenz:
> Everyone,
>
> I'm very new to R, especially when it comes to loops and functions, so
> please bear with me if this is an elementary question. I cannot seem to
> figure out how to construct a loop which runs a function until a certain
> value is computed. For example, say I have the following:
>
> num = numeric (10)
> num [1] = 0
> for (i in 2:10) {
> num [i] = num [i-1] + 5
> }
>
> This adds 5 to the preceding spot of a vector of length 10 to get the value
> in the current spot. However, say I don't just want to run this for 10
> spots; rather I want to run it until a certain value (say, 100) is
computed.
> How I construct my loop to do this?
>
> Thanks!
>
>
> [[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.
Here are a couple of constructions that work.
albyn
==========================================
num <- rep(0,10)
for (i in 2:10) {
num[i] <- num[i-1] + 5
if(num[i] > 20) break
} > num
[1] 0 5 10 15 20 25 0 0 0 0
or
num <- rep(0,10)
done <- FALSE
i <- 2
while(!done){
num[i] <- num[i-1] + 5
if(num[i] > 20) done <- TRUE
i <- i + 1
}> num
[1] 0 5 10 15 20 25 0 0 0 0
On Tue, Apr 10, 2012 at 10:48:34AM -0400, Steve Lavrenz
wrote:> Everyone,
>
> I'm very new to R, especially when it comes to loops and functions, so
> please bear with me if this is an elementary question. I cannot seem to
> figure out how to construct a loop which runs a function until a certain
> value is computed. For example, say I have the following:
>
> num = numeric (10)
> num [1] = 0
> for (i in 2:10) {
> num [i] = num [i-1] + 5
> }
>
> This adds 5 to the preceding spot of a vector of length 10 to get the value
> in the current spot. However, say I don't just want to run this for 10
> spots; rather I want to run it until a certain value (say, 100) is
computed.
> How I construct my loop to do this?
>
> Thanks!
>
>
> [[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.
>
--
Albyn Jones
Reed College
jones at reed.edu
Do you need a loop at all? Will this do the trick? seq(from=0, to=100, by=5) Jean Steve Lavrenz wrote on 04/10/2012 09:48:34 AM:> Everyone, > > I'm very new to R, especially when it comes to loops and functions, so > please bear with me if this is an elementary question. I cannot seem to > figure out how to construct a loop which runs a function until a certain > value is computed. For example, say I have the following: > > num = numeric (10) > num [1] = 0 > for (i in 2:10) { > num [i] = num [i-1] + 5 > } > > This adds 5 to the preceding spot of a vector of length 10 to get thevalue> in the current spot. However, say I don't just want to run this for 10 > spots; rather I want to run it until a certain value (say, 100) iscomputed.> How I construct my loop to do this? > > Thanks![[alternative HTML version deleted]]
While you can build up a vector like this in a for loop, this is exactly
the sort of construction that leads to excessive memory growth because on
each iteration of the loop R creates a new copy of the vector x - old
copies have no references to them, but are not deallocated until the next
automatic garbage collection. If the vector is small, this is probably of
no consequence. But if it is large, this sort of construction leads to alot
of garbage collection, slowing down the calculation dramatically (as shown
in Albyn's example).
To see the magnitude of the extra memory, and how often the garbage
collection is kicking in - look at this
gc() # to get down to a base level of memory before starting the loop
x = 5
mem=numeric(9999)
mem[1] = memory.size()
for (i in 2:10000) {
x[i] = x[i-1]+5
mem[i] = memory.size()
}
plot(mem)
notice that the peak memory allocated during the loop is > 4 MB, even
though after the loop is finished
object.size(x)
80024 bytes
Albyn's solution of allocating more than necessary and then tossing the
rest away would be much more efficient, even if you allocated 10 - 50x more
than necessary! You could also put in a test for approaching the end of the
allocated space, and have it double the length. This is more efficient
because it restricts the number of duplications of the object x.
On Tue, Apr 10, 2012 at 10:58 AM, Jessica Streicher <
j.streicher@micromata.de> wrote:
> > x<-numeric(1)
> > x
> [1] 0
> > x[2]<-2
> > x
> [1] 0 2
>
> you don't really need to define the length?
>
>
> Am 10.04.2012 um 17:45 schrieb Albyn Jones:
>
> > Here are a couple of constructions that work.
> >
> > albyn
> > ==========================================> >
> > num <- rep(0,10)
> > for (i in 2:10) {
> > num[i] <- num[i-1] + 5
> > if(num[i] > 20) break
> > }
> >> num
> > [1] 0 5 10 15 20 25 0 0 0 0
> >
> > or
> >
> > num <- rep(0,10)
> > done <- FALSE
> > i <- 2
> > while(!done){
> > num[i] <- num[i-1] + 5
> > if(num[i] > 20) done <- TRUE
> > i <- i + 1
> > }
> >> num
> > [1] 0 5 10 15 20 25 0 0 0 0
> >
> >
> > On Tue, Apr 10, 2012 at 10:48:34AM -0400, Steve Lavrenz wrote:
> >> Everyone,
> >>
> >> I'm very new to R, especially when it comes to loops and
functions, so
> >> please bear with me if this is an elementary question. I cannot
seem to
> >> figure out how to construct a loop which runs a function until a
certain
> >> value is computed. For example, say I have the following:
> >>
> >> num = numeric (10)
> >> num [1] = 0
> >> for (i in 2:10) {
> >> num [i] = num [i-1] + 5
> >> }
> >>
> >> This adds 5 to the preceding spot of a vector of length 10 to get
the
> value
> >> in the current spot. However, say I don't just want to run
this for 10
> >> spots; rather I want to run it until a certain value (say, 100) is
> computed.
> >> How I construct my loop to do this?
> >>
> >> Thanks!
> >>
> >>
> >> [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> R-help@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.
> >>
> >
> > --
> > Albyn Jones
> > Reed College
> > jones@reed.edu
> >
> > ______________________________________________
> > R-help@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.
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help@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.
>
--
Drew Tyre
School of Natural Resources
University of Nebraska-Lincoln
416 Hardin Hall, East Campus
3310 Holdrege Street
Lincoln, NE 68583-0974
phone: +1 402 472 4054
fax: +1 402 472 2946
email: atyre2@unl.edu
http://snr.unl.edu/tyre
http://aminpractice.blogspot.com
http://www.flickr.com/photos/atiretoo
[[alternative HTML version deleted]]