Oh true, this would solve the problem too :-)
Thanks a lot for the suggestions!
Antje
Martin Morgan schrieb:
Antje <[EMAIL PROTECTED]> writes:
Thanks a lot for your help!
I know that I cannot directly access the list created, I just was not
sure if there is any "format" of the return value which could provide
additionally a name for the returned list.
I tried to return the values as list with the appropriate name but
then I end up with a list entry as list entry...
Okay, then I'll solve it with a loop and thanks for the hint with the article
maybe this:
res <- lapply(1:5, function(i) list(key=paste("Hugo", i, sep="_"), val=i))
val <- lapply(res, "[[", "val")
names(val) <- lapply(res, "[[", "key")
val
$Hugo_1
[1] 1
$Hugo_2
[1] 2
$Hugo_3
[1] 3
$Hugo_4
[1] 4
$Hugo_5
[1] 5
Martin
Ciao,
Antje
Gavin Simpson schrieb:
On Fri, 2008-07-18 at 14:19 +0200, Antje wrote:
Hi Gavin,
thanks a lot for your answer.
Maybe I did not explain very well what I want to do and probably
chose a bad example. I don't mind spaces or names starting with a
number. I could even name it:
"Hugo1", "Hugo2", ...
My biggest problem is, that not only the values are
calculated/estimated within my function but also the names (Yes, in
reality my funtion is more complicated).
Maybe it's easier to explain like this. the parameter x can be a
coordinate position of mountains on earth. Within the funtion the
height of the mountain is estimated and it's name.
In the end, I'd like to get a list, where the entry is named like
the mountain and it contains its height (or other measurements...)
## now that we have a list, we change the names to what you want
names(ret) <- paste(1:10, "info_within_function")
so this would not work, because I don't have the information
anymore about the naming...
OK, so you can't do what you want to do in the manner you tried, via
lapply as you don't have control of how the list is produced once the
loop over 1:10 has been performed. At the stage that 'test' is being
applied, all it knows about is 'x' and it doesn;t have access to the
list being built up by lapply().
The *apply family of functions help us to *not* write out formal
loops
in R, but here this is causing you a problem. So we can specify an
explicit loop and fill in information as and when we want from within
the loop
## create list to hold results
n <- 10
ret <- vector(mode = "list", length = n)
## initialise loop
for(i in seq_len(n)) {
## do whatever you need to do here, but this line just
## replicates what 'test' did earlier
ret[[i]] <- c(1,2,3,4,5)
## now add the name in
names(ret)[i] <- paste("Mountain", i, sep = "")
}
ret
Alternatively, collect a vector of names during the loop and then
once
the loop is finished do a single call to names(ret) to replace all the
names at once:
n <- 10
ret <- vector(mode = "list", length = n)
## new vector to hold vector of names
name.vec <- character(n)
for(i in seq_len(n)) {
ret[[i]] <- c(1,2,3,4,5)
## now we just fill in this vector as we go
name.vec[i] <- paste("Mountain", i, sep = "")
}
## now replace all the names at once
names(ret) <- name.vec
ret
This latter version is likely to more efficient if n is big so you
don't
incur the overhead of the repeated calls to names()
The moral of the story is to not jump to using *apply all the time
to
avoid loops. Loops in R are just fine, so use the tool that helps you do
the job most efficiently *and* most transparently.
Take a look at the R Help Desk article by Uwe Ligges and John Fox in
the
current issue of RNews:
http://www.r-project.org/doc/Rnews/Rnews_2008-1.pdf
Which goes into this in much more detail
HTH
G
______________________________________________
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.