[R] list assignment syntax?

Joshua Wiley jwiley.psych at gmail.com
Sat Mar 31 04:24:18 CEST 2012


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/



More information about the R-help mailing list