[R] Unexpected output in first iteration of for-loop

Don MacQueen macq at llnl.gov
Thu Feb 11 16:50:04 CET 2010


You have a mistake in how you're setting up the object named "result" 
before the loop.

You set result <- latentVariableNames. It is a vector of length 6, 
when you call the function with LV. The printout from the first 
iteration shows this.

But then you rbind result with a data frame that has three columns. 
These are basically incompatible, but R (apparently silently) wraps 
the vector of length 6 into two rows of three columns.

Here's an example:

>  foo <- letters[1:6]
>  names(foo) <- c('a','b','c')
>  foo
    a    b    c <NA> <NA> <NA>
  "a"  "b"  "c"  "d"  "e"  "f"

>  rbind(foo, data.frame(a='X', b='Y', c='Z',stringsAsFactors=FALSE))
   a b c
1 a b c
2 X Y Z

What I would do is something like this (untested):

loopCronbach <- function(latentVariableNames, groupingVariable) {
   n <- length(latentVariableNames)
   tmp1 <- tmp2 <- numeric(n)

   for (i in 1:n) {
     tmp1[i] <- calculateIndividualCronbach(get(latentVariableNames[i]))
     tmp2[i] <- calculateGroupCronbach(get(latentVariableNames[i]), 
groupingVariable)
   }

   result <- 
data.frame(latentVariable=latentVariableNames,Indiv=tmp1,Group=tmp2)
   names(result) <- c("latentVariable", "Indiv", "Group")
   result     ## no need to use return()
}

Building up a dataframe row by row using rbind() is in general an 
expensive way to do things -- although in this instance it's such a 
small dataframe that it doesn't matter.

-Don

At 10:56 AM +0100 2/11/10, Chaehan So wrote:
>Ok, you're right -  may I rephrase:
>How should I modify the assignment of result <- latentVariableNames
>so it produces the output without the first line?
>I thought result <- NULL should do the job, but it didn't because of the
>following names(result) assignment (which I understand, but not how I
>can workaround it).
>
>Here's the output and code again:
>
>   latentVariable   Indiv Group
>1      rPlanning rIterat  rTDD
>2      rPlanning    0.79  0.84
>3        rIterat    0.79  0.83
>4           rTDD     0.9  0.96
>5       rStandup    0.83  0.82
>6        rRetros     0.9  0.95
>7        rAccess    0.91  0.92
>8       rAccTest    0.87   0.9
>
>#####
>LV <- c("rPlanning", "rIterat", "rTDD", "rStandup", "rRetros", "rAccess",
>"rAccTest")
>#####
>loopCronbach <- function(latentVariableNames, groupingVariable)
>{
>result <- latentVariableNames
>names(result) <- c("latentVariable", "Indiv", "Group")
>  for (currentName in latentVariableNames)
>{
>print(currentName)
>print(result)
>tmp1 <- calculateIndividualCronbach(get(currentName))
>tmp2 <- calculateGroupCronbach(get(currentName), groupingVariable)
>result <- rbind(result,data.frame(latentVariable=currentName,
>Indiv=tmp1,Group=tmp2))
>}
>return(result)
>}
>
>On Thu, Feb 11, 2010 at 3:31 AM, jim holtman <jholtman at gmail.com> wrote:
>
>>  It doing exactly what you asked it to do.  You have the assignment:
>>
>>  result <- latentVariableNames
>>
>>  and then you print it out in the loop.  What were you expecting?
>>
>>  On Wed, Feb 10, 2010 at 9:06 PM, Chaehan So <chaehan.so at gmail.com> wrote:
>  > > Dear r-helpers,
>  > >
>  > > why do I get an output in the first iteration of the for-loop
>  > > which contains the string values of the input vector,
>  > > and how can I avoid that?
>>  >
>>  > Here's the output (only line 1 is wrong)
>>  >
>>  >  latentVariable   Indiv Group
>>  > 1      rPlanning rIterat  rTDD
>>  > 2      rPlanning    0.79  0.84
>>  > 3        rIterat    0.79  0.83
>>  > 4           rTDD     0.9  0.96
>>  > 5       rStandup    0.83  0.82
>>  > 6        rRetros     0.9  0.95
>>  > 7        rAccess    0.91  0.92
>>  > 8       rAccTest    0.87   0.9
>>  >
>>  > #####
>>  > LV <- c("rPlanning", "rIterat", "rTDD", "rStandup", "rRetros", "rAccess",
>>  > "rAccTest")
>>  > #####
>>  > loopCronbach <- function(latentVariableNames, groupingVariable)
>>  > {
>>  > result <- latentVariableNames
>>  > names(result) <- c("latentVariable", "Indiv", "Group")
>>  >  for (currentName in latentVariableNames)
>>  > {
>>  > print(currentName)
>>  > print(result)
>>  > tmp1 <- calculateIndividualCronbach(get(currentName))
>  > > tmp2 <- calculateGroupCronbach(get(currentName), groupingVariable)
>>  > result <- rbind(result,data.frame(latentVariable=currentName,
>>  > Indiv=tmp1,Group=tmp2))
>>  > }
>>  > return(result)
>>  > }
>>  >
>>  >
>>  > a <- loopCronbach(LV, u_proj)
>>  >
>>  >        [[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.
>>  >
>>
>>
>>
>>  --
>>  Jim Holtman
>>  Cincinnati, OH
>>  +1 513 646 9390
>>
>>  What is the problem that you are trying to solve?
>>
>
>
>
>--
>Humboldt University Berlin, Germany
>Institute of Psychology
>Rudower Chaussee 18, Room 1221
>12489 Berlin
>Germany
>Office: +49 30 2093 - 9337
>Mobile: +49 171- 626 9373
>
>	[[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.


-- 
--------------------------------------
Don MacQueen
Environmental Protection Department
Lawrence Livermore National Laboratory
Livermore, CA, USA
925-423-1062



More information about the R-help mailing list