[R] list assignment syntax?

jim holtman jholtman at gmail.com
Sat Mar 31 08:06:58 CEST 2012


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
<jdnewmil at 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:<jdnewmil at 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.berton at 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.psych at 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.welch at 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.welch at gmail.com)
>>>>
>>>>
>>>>
>>>> On Fri, Mar 30, 2012 at 5:08 PM, Justin Haynes <jtor14 at 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 <ehlers at 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.welch at brown.edu, ivo.welch at 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 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.
>>>>
>>>> ______________________________________________
>>>> 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
>>> Programmer Analyst II, Statistical Consulting Group
>>> University of California, Los Angeles
>>> https://joshuawiley.com/
>>>
>>> ______________________________________________
>>> 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.
>>
>>
>>
>>--
>>
>>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 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.
>
> ______________________________________________
> 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
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.



More information about the R-help mailing list