Dear R Users,
another problem for me is the output of a function.
I have several output variables which I give back with the list command.
test <- function {return(list(a,b,c,d,e,f,g,...))}
After the usage of the function I want to assign the variables to the output variables.
result <- test()
a <- result$a
b <- result$b
c <- result$c
d <- result$d
...
is there a more elegant way to assign these variables, without writing them all down?
thank you very much for your help!
Stefan Fritsch
Return a list
10 messages · Stefan Fritsch, Baptiste Auguie, Henrique Dallazuanna +5 more
?attach or ?with Hope this helps, baptiste
On 26 Sep 2008, at 14:57, Stefan Fritsch wrote:
Dear R Users,
another problem for me is the output of a function.
I have several output variables which I give back with the list
command.
test <- function {return(list(a,b,c,d,e,f,g,...))}
After the usage of the function I want to assign the variables to
the output variables.
result <- test()
a <- result$a
b <- result$b
c <- result$c
d <- result$d
...
is there a more elegant way to assign these variables, without
writing them all down?
thank you very much for your help!
Stefan Fritsch
______________________________________________ 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.
_____________________________ Baptiste Augui? School of Physics University of Exeter Stocker Road, Exeter, Devon, EX4 4QL, UK Phone: +44 1392 264187 http://newton.ex.ac.uk/research/emag
Try this: sapply(names(result), function(nm)assign(nm, result[[nm]], envir = globalenv())) On Fri, Sep 26, 2008 at 10:57 AM, Stefan Fritsch
<fritsch at bips.uni-bremen.de> wrote:
Dear R Users,
another problem for me is the output of a function.
I have several output variables which I give back with the list command.
test <- function {return(list(a,b,c,d,e,f,g,...))}
After the usage of the function I want to assign the variables to the output variables.
result <- test()
a <- result$a
b <- result$b
c <- result$c
d <- result$d
...
is there a more elegant way to assign these variables, without writing them all down?
thank you very much for your help!
Stefan Fritsch
______________________________________________ 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.
Henrique Dallazuanna Curitiba-Paran?-Brasil 25? 25' 40" S 49? 16' 22" O
"Stefan Fritsch" <fritsch at bips.uni-bremen.de> wrote:
I have several output variables which I give back with the list command.
test <- function {return(list(a,b,c,d,e,f,g,...))}
After the usage of the function I want to assign the variables to the output variables.
result <- test()
a <- result$a
b <- result$b
c <- result$c
d <- result$d
...
is there a more elegant way to assign these variables, without writing them all down?
thank you very much for your help!
I don't have a good answer for your question, but I do encourage you to choose a method that will be readily intelligible to you when you revisit your code X years later.
Mike Prager, NOAA, Beaufort, NC * Opinions expressed are personal and not represented otherwise. * Any use of tradenames does not constitute a NOAA endorsement.
Mike Prager wrote:
"Stefan Fritsch" <fritsch at bips.uni-bremen.de> wrote:
I have several output variables which I give back with the list command.
test <- function {return(list(a,b,c,d,e,f,g,...))}
After the usage of the function I want to assign the variables to the output variables.
result <- test()
a <- result$a
b <- result$b
c <- result$c
d <- result$d
...
is there a more elegant way to assign these variables, without writing them all down?
arguably ugly and risky, but simple: for (name in names(result)) assign(name, result[[name]]) (note, for this to work you actually need to name the components of the returned list: return(list(a=a,b=b,...))) vQ
But why do this? Just leave the (preferably named) variables as list components and work with them there. 1. ?comment tells you how to add a comment attribute to the list for self documentation (what were the components? how are they related? etc.) 2. ?with shows you how to access the components of the list individually in the "usual" way. 3. ?lapply and friends shows you how to "loop" over list components . etc. Cheers, Bert Bert Gunter Genentech -----Original Message----- From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Wacek Kusnierczyk Sent: Friday, September 26, 2008 12:40 PM To: Mike Prager Cc: R help Subject: Re: [R] Return a list
Mike Prager wrote:
"Stefan Fritsch" <fritsch at bips.uni-bremen.de> wrote:
I have several output variables which I give back with the list command.
test <- function {return(list(a,b,c,d,e,f,g,...))}
After the usage of the function I want to assign the variables to the
output variables.
result <- test() a <- result$a b <- result$b c <- result$c d <- result$d ... is there a more elegant way to assign these variables, without writing
them all down?
arguably ugly and risky, but simple: for (name in names(result)) assign(name, result[[name]]) (note, for this to work you actually need to name the components of the returned list: return(list(a=a,b=b,...))) vQ ______________________________________________ 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.
Un texte encapsul? et encod? dans un jeu de caract?res inconnu a ?t? nettoy?... Nom : non disponible URL : <https://stat.ethz.ch/pipermail/r-help/attachments/20080926/83ef4c3e/attachment.pl>
Bert Gunter wrote:
But why do this? Just leave the (preferably named) variables as list components and work with them there. 1. ?comment tells you how to add a comment attribute to the list for self documentation (what were the components? how are they related? etc.) 2. ?with shows you how to access the components of the list individually in the "usual" way. 3. ?lapply and friends shows you how to "loop" over list components . etc. Cheers, Bert Bert Gunter Genentech
it depends on what the original author wanted.
with constructs a new environment, and all assignments, if any, made in
the expression evaluated within with are invisible to the outside
(unless one plays with environments, again):
x = 1:10
a = 3
with(test(), { x[1:3] = c(a,b,c); x = x+d; a = a + 1 })
x # still 1:10, whatever test returns
a # still 3. whatever test returns
if the author wanted the values included in the list to be visible and
accessible by simple names, and used in assignments in a larger part of
code, using with might be inconvenient.
it does not mean that my solution below is a good one, it's just a quick
fix. i wouldn't do that in myself, it's badly non-functional ;)
vQ
I have several output variables which I give back with the list command.
test <- function {return(list(a,b,c,d,e,f,g,...))}
After the usage of the function I want to assign the variables to the
output variables.
result <- test()
a <- result$a
b <- result$b
c <- result$c
d <- result$d
...
is there a more elegant way to assign these variables, without writing
them all down?
arguably ugly and risky, but simple: for (name in names(result)) assign(name, result[[name]]) (note, for this to work you actually need to name the components of the returned list: return(list(a=a,b=b,...))) vQ
______________________________________________ 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.
------------------------------------------------------------------------------- Wacek Kusnierczyk, MD PhD Email: waku at idi.ntnu.no Phone: +47 73591875, +47 72574609 Department of Computer and Information Science (IDI) Faculty of Information Technology, Mathematics and Electrical Engineering (IME) Norwegian University of Science and Technology (NTNU) Sem Saelands vei 7, 7491 Trondheim, Norway Room itv303 Bioinformatics & Gene Regulation Group Department of Cancer Research and Molecular Medicine (IKM) Faculty of Medicine (DMF) Norwegian University of Science and Technology (NTNU) Laboratory Center, Erling Skjalgsons gt. 1, 7030 Trondheim, Norway Room 231.05.060
that's likely to work, but it's even worse than my non-functional version: the destructive operation on the test's caller's environment is performed here by the callee (test), and you can get ugly surprises if you forget that test does that. i'd consider this (and the 'for (name in names(result)) assign(...)' solution) an anti-pattern. vQ
N. Lapidus wrote:
The answers that were previously given allow you to easily extract results from your returned list, but if I understand well, this list is created only because you cannot return several arguments whereas you need to keep the values of a, b, c, etc. Am I right? Another solution would be to directly "send" the values you want to keep into the environment where they are needed. The following example supposes you need to keep "a" only in the upper environment from which your function was launched, and "b" in another one (e.g. .GlobalEnv). Hope this may help. Nael
# Here is a function such as yours:
test <- function(){
+ a <- 1 + b <- 2 + return(list(a=a, b=b, c=c)) + }
result <- test()
(a <- result$a)
[1] 1
(b <- result$b)
[1] 2
rm(a, b)
# Now our variables will be automatically assigned into the chosen
environment
test2 <- function(){
+ a <- 1
+ b <- 2
+ assign("a", a, envir=parent.frame(n=1))
+ assign("b", b, envir=.GlobalEnv)
+ return(NULL)
+ }
# Suppose test2 is launched by another function
test2.launcher <- function() {
+ test2()
+ print(paste("a exists inside test2.launcher:", exists("a")))
+ print(paste("b exists inside test2.launcher:", exists("b")))
+ return (NULL)
+ }
test2.launcher()
[1] "a exists inside test2.launcher: TRUE" [1] "b exists inside test2.launcher: TRUE" NULL
exists("a")# a still exists in the upper environment
[1] FALSE
exists("b")# b does not
[1] TRUE
it depends on what the original author wanted.
with constructs a new environment, and all assignments, if any, made in
the expression evaluated within with are invisible to the outside
(unless one plays with environments, again):
x = 1:10
a = 3
with(test(), { x[1:3] = c(a,b,c); x = x+d; a = a + 1 })
x # still 1:10, whatever test returns
a # still 3. whatever test returns
if the author wanted the values included in the list to be visible and
accessible by simple names, and used in assignments in a larger part of
code, using with might be inconvenient.
What about within ? Hadley