Noah -
Just allocate the maximum length that you'd ever need, and
then change the length of the vector at the end of the program.
By the way, here's a little demonstration of what a difference
pre-allocation makes:
system.time({x <- NULL;for(i in 1:10000)x <- c(x,rnorm(1))})
user system elapsed
0.584 0.000 0.588
system.time({x <- numeric(10000);for(i in 1:10000)x[i] <- rnorm(1)})
user system elapsed
0.120 0.000 0.122
The difference will be greater if you actually do something inside of
the loop.
To clarify my first point, use something like this:
x = numeric(10000)
j = 0
for(i in 1:10000){
+ r = rnorm(1)
+ if(r < .1){
+ j = j + 1
+ x[j] = r
+ }
+ }
length(x) = j
The overallocation doesn't actually slow things down:
system.time({x <- numeric(10000);for(i in 1:10000)x[i] <- rnorm(1)})
user system elapsed
0.120 0.000 0.122
system.time({x <- numeric(100000);for(i in 1:10000)x[i] <- rnorm(1);length(x)
<- 10000})
user system elapsed
0.128 0.000 0.126
- Phil
On Wed, 26 Aug 2009, Noah Silverman wrote:
Phil,
Pre-allocation makes sense. However, I don't know the size of my resulting
vector when starting. In my loop, I only pull off results that meet a
certain threshold.
-N
On 8/26/09 2:07 PM, Phil Spector wrote:
Noah -
I would strongly advise you to preallocate the result vector
using numeric() or rep(), and then enter the values based on subscripts.
Allowing objects to grow inside of loops is one of
the biggest mistakes an R programmer can make.
- Phil Spector
Statistical Computing Facility
Department of Statistics
UC Berkeley
spec...@stat.berkeley.edu
On Wed, 26 Aug 2009, Noah Silverman wrote:
The actually process is REALLY complicate, I just gave a simple example
for the list.
I have a lot of steps to process the data before I get a final
"score". (nested loops, conditional statements, etc.)
Right now, I'm just printing the scores to the screen. I'd like to
accumulate them in some kind of data structure so I can either write
them to disk or graph them.
-N
On 8/26/09 12:27 PM, Erik Iverson wrote:
How about ?append, but R is vectorized, so why not just
result_list<- 2*item^2 , or for more complicated tasks, the
apply/sapply/lapply/mapply family of functions?
In general, the "for" loop construct can be avoided so you don't have to
think about messy indexing. What exactly are you trying to do?
-----Original Message-----
From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org]
On Behalf Of Noah Silverman
Sent: Wednesday, August 26, 2009 2:20 PM
To: r help
Subject: [R] Managing output
Hi,
Is there a way to build up a vector, item by item. In perl, we can
"push" an item onto an array. How can we can do this in R?
I have a loop that generates values as it goes. I want to end up with a
vector of all the loop results.
In perl it woud be:
for(item in list){
result<- 2*item^2 (Or whatever formula, this is just a pseudo
example)
Push(@result_list, result) (This is the step I can't do in R)
}
Thanks!
______________________________________________
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.
______________________________________________
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.