Maas James Dr (MED)
2010-Sep-16 15:44 UTC
[R] using variable from for loop in naming new variables
Simple one here ... but can't get it to work ... for (i in 1:4){ paste("stuff",[i]),sep="") <- 3 + i } ls() rm(list=ls()) I just want it to create 4 new variables called stuff1, stuff2, stuff3, stuff4 with the corresponding assignments. I realise that there are more elegant functions but this is just a model of a bigger situation. Thanks Jim ==============================Dr. Jim Maas University of East Anglia [[alternative HTML version deleted]]
Ivan Calandra
2010-Sep-16 16:03 UTC
[R] using variable from for loop in naming new variables
Hi! assign() should do the job. But using a list, and filling each element iteratively (with a for loop or with *apply() ) might be better, up to you. Btw, why do you remove your objects? HTH, Ivan Le 9/16/2010 17:44, Maas James Dr (MED) a écrit :> Simple one here ... but can't get it to work ... > > for (i in 1:4){ > paste("stuff",[i]),sep="")<- 3 + i > } > > ls() > rm(list=ls()) > > > > I just want it to create 4 new variables called stuff1, stuff2, stuff3, stuff4 with the corresponding assignments. I realise that there are more elegant functions but this is just a model of a bigger situation. > > Thanks > > Jim > > > ==============================> Dr. Jim Maas > University of East Anglia > > > [[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. >-- Ivan CALANDRA PhD Student University of Hamburg Biozentrum Grindel und Zoologisches Museum Abt. Säugetiere Martin-Luther-King-Platz 3 D-20146 Hamburg, GERMANY +49(0)40 42838 6231 ivan.calandra@uni-hamburg.de ********** http://www.for771.uni-bonn.de http://webapp5.rrz.uni-hamburg.de/mammals/eng/mitarbeiter.php [[alternative HTML version deleted]]
David Winsemius
2010-Sep-16 16:14 UTC
[R] using variable from for loop in naming new variables
On Sep 16, 2010, at 11:44 AM, Maas James Dr (MED) wrote:> Simple one here ... but can't get it to work ... > > for (i in 1:4){ > paste("stuff",[i]),sep="") <- 3 + i > } > > ls() > rm(list=ls())> for (i in 1:4){ + paste("stuff",[i]),sep="") <- 3 + i Error: unexpected '[' in: "for (i in 1:4){ paste("stuff",[" So the first error pointed you to a problem > } Error: unexpected '}' in "}" Fixing that error points you to another: > for (i in 1:4){ + paste("stuff", i),sep="") <- 3 + i Error: unexpected ',' in: "for (i in 1:4){ paste("stuff", i)," And when the syntax gets unsnarled you find that you are trying not using the correct semantics for assignment: > for (i in 1:4){ + paste("stuff",i,sep="") <- 3 + i + } Error in paste("stuff", i, sep = "") <- 3 + i : target of assignment expands to non-language object You are currently attempting to "assign" a numeric value to a character vector. (That is, once stop throwing an error because putting the square brackets around "i" ... and you lose the right- paren before the sep argument.) Try looking at the help page for assign (and working more basic examples): ?assign.> > > > I just want it to create 4 new variables called stuff1, stuff2, > stuff3, stuff4 with the corresponding assignments. I realise that > there are more elegant functions but this is just a model of a > bigger situation. > > Thanks > > Jim > > > ==============================> Dr. Jim Maas > University of East Anglia > > > [[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.David Winsemius, MD West Hartford, CT
This is FAQ 7.21. Note that the most important part of the FAQ is the last few lines where it essentially says "DON'T DO THIS". If this is just a model for a bigger situation then definitely Don't Do This, as using assign and global variables will just create more and bigger future headaches. Use another data structure like a list and all this becomes much easier. -- Gregory (Greg) L. Snow Ph.D. Statistical Data Center Intermountain Healthcare greg.snow at imail.org 801.408.8111> -----Original Message----- > From: r-help-bounces at r-project.org [mailto:r-help-bounces at r- > project.org] On Behalf Of Maas James Dr (MED) > Sent: Thursday, September 16, 2010 9:45 AM > To: r-help at r-project.org > Subject: [R] using variable from for loop in naming new variables > > Simple one here ... but can't get it to work ... > > for (i in 1:4){ > paste("stuff",[i]),sep="") <- 3 + i > } > > ls() > rm(list=ls()) > > > > I just want it to create 4 new variables called stuff1, stuff2, stuff3, > stuff4 with the corresponding assignments. I realise that there are > more elegant functions but this is just a model of a bigger situation. > > Thanks > > Jim > > > ==============================> Dr. Jim Maas > University of East Anglia > > > [[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.
Joshua Wiley
2010-Sep-16 20:23 UTC
[R] using variable from for loop in naming new variables
Dear Jim, Just to follow up some of the great suggestions with some examples: ######################################### # Initialize a list, length 4 lstuff <- vector(mode = "list", length = 4) # store the results of your for loop in it for (i in 1:4) { lstuff[[i]] <- 3 + i } # The assign() way for(i in 1:4) { assign(x = paste("stuff", i, sep = ''), value = 3 + i, envir = .GlobalEnv) } # Now lets see about accessing the data stuff1 lstuff[[1]] lstuff # see all elements of the list at once # So far, so good, but since they are named similarly # maybe I want to do a similar operation on all of them # Using the list lstuff <- lapply(lstuff, '+', y = 3) # Using the results of the for loop # stuff1 <- stuff1 + 3 # for every single one, or... for(i in 1:4) { assign(x = paste("stuff", i, sep = ''), value = get(paste("stuff", i, sep ='')) + 3, envir = .GlobalEnv) } # looking again stuff1 lstuff[[1]] # if you are concerned because the real thing is more complex lstuff[[1]] <- data.frame(A = 1:10, B = 11:20) lstuff[[2]] <- matrix(rnorm(10)) # you can store much more complex objects in the list # so no need to worry if "stuff" is actually going to be # data frames or tables or ... ################################################ Cheers, Josh On Thu, Sep 16, 2010 at 8:44 AM, Maas James Dr (MED) <J.Maas at uea.ac.uk> wrote:> Simple one here ... but can't get it to work ... > > for (i in 1:4){ > ? ?paste("stuff",[i]),sep="") <- 3 + i > } > > ls() > rm(list=ls()) > > > > I just want it to create 4 new variables called stuff1, stuff2, stuff3, stuff4 with the corresponding assignments. ?I realise that there are more elegant functions but this is just a model of a bigger situation. > > Thanks > > Jim > > > ==============================> Dr. Jim Maas > University of East Anglia > > > ? ? ? ?[[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. >-- Joshua Wiley Ph.D. Student, Health Psychology University of California, Los Angeles http://www.joshuawiley.com/
Ivan Calandra
2010-Sep-17 11:46 UTC
[R] using variable from for loop in naming new variables
Hi Jim, First, I think it's better if you reply to the list, other users might be interested and have better answers. Second, as other replies showed you, using a list is actually way easier than creating new objects every time. Check especially the reply from Joshua Wiley, which gives you great examples and guidance. Last, regarding rm(list=ls()), what's the point of creating new objects in your loop if you remove them right after?! Maybe you intend to do stuff on them first. Anyway, I don't use Emacs so not sure why you do it that way. Just my limited opinion. HTH, Ivan Le 9/17/2010 12:35, Maas James Dr (MED) a écrit :> > Hi Ivan, > > Thanks for suggestions, was just hoping to do it all in one step, > creating a list and then filling it all seems rather complicated ... > will look up *apply. > > As for removing objects, I run R interactively from within Emacs (ESS) > and stuff hangs around for successive evaluations, not sure where it > came from so I clean it out every time ... is there a better way? > > Thanks > > Jim > > Message: 65 > > Date: Thu, 16 Sep 2010 18:03:29 +0200 > > From: Ivan Calandra <ivan.calandra@uni-hamburg.de> > > To: r-help@r-project.org > > Subject: Re: [R] using variable from for loop in naming new variables > > Message-ID: <4C923FD1.8000503@uni-hamburg.de> > > Content-Type: text/plain > > Hi! > > assign() should do the job. > > But using a list, and filling each element iteratively (with a for loop > > or with *apply() ) might be better, up to you. > > Btw, why do you remove your objects? > > HTH, > > Ivan > > Le 9/16/2010 17:44, Maas James Dr (MED) a ?crit : > > > Simple one here ... but can't get it to work ... > > > > > > for (i in 1:4){ > > > paste("stuff",[i]),sep="")<- 3 + i > > > } > > > > > > ls() > > > rm(list=ls()) > > > > > > > > > > > > I just want it to create 4 new variables called stuff1, stuff2, > stuff3, stuff4 with the corresponding assignments. I realise that > there are more elegant functions but this is just a model of a bigger > situation. > > > > > > Thanks > > > > > > Jim > > > > > ==============================> > Dr. Jim Maas > > Research Associate in Network Meta-Analysis > > School of Medicine, Health Policy and Practice > > CD Annex, Room 1.04 > > University of East Anglia > > Norwich, UK > > NR4 7TJ > > +44 (0) 1603 591412 >-- Ivan CALANDRA PhD Student University of Hamburg Biozentrum Grindel und Zoologisches Museum Abt. Säugetiere Martin-Luther-King-Platz 3 D-20146 Hamburg, GERMANY +49(0)40 42838 6231 ivan.calandra@uni-hamburg.de ********** http://www.for771.uni-bonn.de http://webapp5.rrz.uni-hamburg.de/mammals/eng/mitarbeiter.php [[alternative HTML version deleted]]