I agree that global side effects are a bad idea, but ivo started this by pointing out that it is straightforward to do this in Perl. It might be worth considering adding this capability to R. --------------------------------------------------------------------------- Jeff Newmiller The ..... ..... Go Live... DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... Live: OO#.. Dead: OO#.. Playing Research Engineer (Solar/Batteries O.O#. #.O#. with /Software/Embedded Controllers) .OO#. .OO#. rocks...1k --------------------------------------------------------------------------- Sent from my phone. Please excuse my brevity.
Bert Gunter <gunter.ber...@gene.com> wrote: >,,,But assigning to the global environment is a bad idea. You're just >asking for trouble -- overwriting without warning something that's >already there. > >May I suggest a rule of thumb: When things are difficult or clumsy to >do in R, don't do them. > >Of course this is not inviolable, but the OP's request may be one >instance where it applies. > >-- Bert > >On Fri, Mar 30, 2012 at 7:24 PM, Joshua Wiley <jwiley.ps...@gmail.com> >wrote: >> An idiom like this would also work. >> >> f <- function(a,b) list( data.frame(a+rnorm(20), b), loess( a ~ b) ) >> lapply(seq_along(out <- f(1:20, 1:20)), function(i) assign(c("c", >> "d")[i], out[[i]], envir = .GlobalEnv)) >> >> It is not elegant if you are doing this regularly, but, I think, >> functions typically return lists of output rather than assigning to >> the global environment because presumably one function returns >related >> objects so it makes sense for them to stay grouped in a list. If the >> two steps really are unrelated, then use two functions. >> >> It seems like what you want is to have a function return each object >> not in a list but to the global environment, but you would like to be >> able to give them your own names (which makes sense). If this is >with >> your own functions, you could adapt them easily to accept names and >> then assign to global. >> >> f <- function(a,b, names = c("a", "b")) { >> assign(names[1], data.frame(a + rnorm(20), b), envir = .GlobalEnv) >> assign(names[2], loess(a ~ b), envir = .GlobalEnv) >> } >> f(1:20, 1:20, c("c", "d")) >> >> I'm not arguing against Gabor's list function, just tossing out a few >> other ideas. I am not familiar with perl, but in R I am used to the >> thing on the left being what is assigned to; the list[a, b] assigning >> to global is counterintuitive to me personally. >> >> Given that this works: >> >> .GlobalEnv[["a"]] <- 1 >> a >> >> I was hoping that: >> >> .GlobalEnv[c("c", "d")] <- f(1:20, 1:20) >> >> would also, but alas environments are not subsettable. Interesting >question. >> >> Cheers, >> >> Josh >> >> On Fri, Mar 30, 2012 at 6:26 PM, ivo welch <ivo.we...@gmail.com> >wrote: >>> thanks, everyone. I should have been clearer (as always). I used >the >>> numbers as an example only. I am aware that I can put numbers into >>> vectors and get nice R syntax. my problem is that I usually want to >>> return multiple and/or mixed objects, such as multiple data frames. > I >>> should have given as an example something like >>> >>> f <- function(a,b) list( data.frame(a+rnorm(20), b), loess( a ~ b) >) >>> >>> weidong---yes, nice syntax, but I don't want to invoke f() twice. >>> >>> peter---I don't think your unlist syntax works. I tried it. >>> >>> gabor---#1-#3 work, but aren't what I really want. #4 is exactly >what >>> I wanted. can list[] be added into the standard core R as a >feature? >>> it would seem like a natural part of the syntax for functions >>> returning multiple values. >>> >>> justin---mea culpa. >>> >>> regards, >>> >>> /iaw >>> ---- >>> Ivo Welch (ivo.we...@gmail.com) >>> >>> >>> >>> On Fri, Mar 30, 2012 at 5:08 PM, Justin Haynes <jto...@gmail.com> >wrote: >>>> You can also take a look at >>>> >>>> >http://stackoverflow.com/questions/7519790/assign-multiple-new-variables-in-a-single-line-in-r >>>> >>>> which has some additional solutions. >>>> >>>> >>>> >>>> On Fri, Mar 30, 2012 at 4:49 PM, Peter Ehlers <ehl...@ucalgary.ca> >wrote: >>>>> On 2012-03-30 15:40, ivo welch wrote: >>>>>> >>>>>> Dear R wizards: is there a clean way to assign to elements in a >list? >>>>>> what I would like to do, in pseudo R+perl notation is >>>>>> >>>>>> f<- function(a,b) list(a+b,a-b) >>>>>> (c,d)<- f(1,2) >>>>>> >>>>>> and have c be assigned 1+2 and d be assigned 1-2. right now, I >use the >>>>>> clunky >>>>>> >>>>>> x<- f(1,2 >>>>>> c<- x[[1]] >>>>>> d<- x[[2]] >>>>>> rm(x) >>>>>> >>>>>> which seems awful. is there a nicer syntax? >>>>>> >>>>>> regards, /iaw >>>>>> ---- >>>>>> Ivo Welch (ivo.we...@brown.edu, ivo.we...@gmail.com) >>>>>> >>>>> >>>>> I must be missing something. Why not just assign to a >>>>> vector instead of a list? >>>>> >>>>> f<- function(a,b) c(a+b,a-b) >>>>> >>>>> If it's imperative that f return a list, then you >>>>> could use >>>>> >>>>> (c, d) <- unlist(f(a, b)) >>>>> >>>>> to get vector (c, d). >>>>> >>>>> Peter Ehlers >>>>> >>>>> >>>>> ______________________________________________ >>>>> 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. >> >> >> >> -- >> Joshua Wiley >> Ph.D. Student, Health Psychology >> Programmer Analyst II, Statistical Consulting Group >> University of California, Los Angeles >> https://joshuawiley.com/ >> >> ______________________________________________ >> 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. > > > >-- > >Bert Gunter >Genentech Nonclinical Biostatistics > >Internal Contact Info: >Phone: 467-7374 >Website: >http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm > >______________________________________________ >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.