,,,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.