All of this is syntactic sugar.  Just because a language does not have
the sintax that you are used (e.g, Perl) does not make it bad/hard to
use.  What is the problem if I have to type a couple of extra lines:

f <- function(x) list(a = seq_along(x), b=x*3)
result <- f(1)
r1 <- result$a
r2 <- result$b

If you don't want to pay the "keystrokes", then use some macros
(EMACS, hotKeys, etc.) to encapsulate that in a single keystroke.

As I say in my tag line:  "what is the problem you are trying to solve".

On Sat, Mar 31, 2012 at 1:56 AM, Jeff Newmiller
<jdnew...@dcn.davis.ca.us> wrote:
> 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.



-- 
Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.

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

Reply via email to