[R] list assignment syntax?

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Sat Mar 31 07:56:05 CEST 2012


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.



More information about the R-help mailing list