Hi, When using lapply (or sapply) to loop over a list, can I somehow access the index of the list from inside the function? A trivial example: df1 <- split( x=rnorm(n=100, sd=seq(from=1, to=10, each=10)), f=letters[seq(from=1, to=10, each=10)] ) str(df1) #List of 10 # $ a: num [1:10] -0.801 0.418 1.451 -0.554 -0.578 ... # $ b: num [1:10] -2.464 0.279 4.099 -2.483 1.921 ... # $ c: num [1:10] -1.14 -1.773 2.512 -2.072 -0.904 ... # $ d: num [1:10] 2.109 1.243 0.627 -2.343 -6.071 ... #... par(mfcol=c(5,2)) lapply(df1, plot) This plots each element of the list, but the label on the vertical axis is X[[0L]] (as expected from the documentation in ?lapply). I'd like the heading for each plot to be the name of that item in the list. This can be achieved by using a for-loop: for (i in names(df1)) plot(df1[[i]], ylab=i) but can it somehow be achieved bu using lapply? I would be hoping for something like lapply(df1, function(x) plot(x, ylab=parent.index())) or some way to parse the index number out of the call, using match.call() or something like that. Thanks in advance for any comments, Bjarke Christensen
lapply over the list names rather than the list itself: junk <- lapply(names(df1), function(nm) plot(df1[[nm]], ylab = nm)) On Thu, Nov 19, 2009 at 7:27 AM, Bjarke Christensen <Bjarke.Christensen at sydbank.dk> wrote:> > Hi, > > When using lapply (or sapply) to loop over a list, can I somehow access the > index of the list from inside the function? > > A trivial example: > > df1 <- split( > ? x=rnorm(n=100, sd=seq(from=1, to=10, each=10)), > ? f=letters[seq(from=1, to=10, each=10)] > ?) > str(df1) > #List of 10 > # $ a: num [1:10] -0.801 0.418 1.451 -0.554 -0.578 ... > # $ b: num [1:10] -2.464 0.279 4.099 -2.483 1.921 ... > # $ c: num [1:10] -1.14 -1.773 2.512 -2.072 -0.904 ... > # $ d: num [1:10] 2.109 1.243 0.627 -2.343 -6.071 ... > #... > par(mfcol=c(5,2)) > lapply(df1, plot) > > This plots each element of the list, but the label on the vertical axis is > X[[0L]] (as expected from the documentation in ?lapply). I'd like the > heading for each plot to be the name of that item in the list. This can be > achieved by using a for-loop: > > for (i in names(df1)) plot(df1[[i]], ylab=i) > > but can it somehow be achieved bu using lapply? I would be hoping for > something like > > lapply(df1, function(x) plot(x, ylab=parent.index())) > > or some way to parse the index number out of the call, using match.call() > or something like that. > > Thanks in advance for any comments, > Bjarke Christensen > > ______________________________________________ > 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. >
On 19/11/2009 7:27 AM, Bjarke Christensen wrote:> Hi, > > When using lapply (or sapply) to loop over a list, can I somehow access the > index of the list from inside the function? >No, but you can loop over the indices in lapply, not just in a for loop. For example, lapply(names(df1), function(x) plot(df1[[x]], ylab=x)) Duncan Murdoch> A trivial example: > > df1 <- split( > x=rnorm(n=100, sd=seq(from=1, to=10, each=10)), > f=letters[seq(from=1, to=10, each=10)] > ) > str(df1) > #List of 10 > # $ a: num [1:10] -0.801 0.418 1.451 -0.554 -0.578 ... > # $ b: num [1:10] -2.464 0.279 4.099 -2.483 1.921 ... > # $ c: num [1:10] -1.14 -1.773 2.512 -2.072 -0.904 ... > # $ d: num [1:10] 2.109 1.243 0.627 -2.343 -6.071 ... > #... > par(mfcol=c(5,2)) > lapply(df1, plot) > > This plots each element of the list, but the label on the vertical axis is > X[[0L]] (as expected from the documentation in ?lapply). I'd like the > heading for each plot to be the name of that item in the list. This can be > achieved by using a for-loop: > > for (i in names(df1)) plot(df1[[i]], ylab=i) > > but can it somehow be achieved bu using lapply? I would be hoping for > something like > > lapply(df1, function(x) plot(x, ylab=parent.index())) > > or some way to parse the index number out of the call, using match.call() > or something like that. > > Thanks in advance for any comments, > Bjarke Christensen > > ______________________________________________ > 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. >
Maybe this : http://tolstoy.newcastle.edu.au/R/e4/help/08/04/8720.html Romain On 11/19/2009 01:27 PM, Bjarke Christensen wrote:> Hi, > > When using lapply (or sapply) to loop over a list, can I somehow access the > index of the list from inside the function? > > A trivial example: > > df1<- split( > x=rnorm(n=100, sd=seq(from=1, to=10, each=10)), > f=letters[seq(from=1, to=10, each=10)] > ) > str(df1) > #List of 10 > # $ a: num [1:10] -0.801 0.418 1.451 -0.554 -0.578 ... > # $ b: num [1:10] -2.464 0.279 4.099 -2.483 1.921 ... > # $ c: num [1:10] -1.14 -1.773 2.512 -2.072 -0.904 ... > # $ d: num [1:10] 2.109 1.243 0.627 -2.343 -6.071 ... > #... > par(mfcol=c(5,2)) > lapply(df1, plot) > > This plots each element of the list, but the label on the vertical axis is > X[[0L]] (as expected from the documentation in ?lapply). I'd like the > heading for each plot to be the name of that item in the list. This can be > achieved by using a for-loop: > > for (i in names(df1)) plot(df1[[i]], ylab=i) > > but can it somehow be achieved bu using lapply? I would be hoping for > something like > > lapply(df1, function(x) plot(x, ylab=parent.index())) > > or some way to parse the index number out of the call, using match.call() > or something like that. > > Thanks in advance for any comments, > Bjarke Christensen-- Romain Francois Professional R Enthusiast +33(0) 6 28 91 30 30 http://romainfrancois.blog.free.fr |- http://tr.im/EAD5 : LondonR slides |- http://tr.im/BcPw : celebrating R commit #50000 `- http://tr.im/ztCu : RGG #158:161: examples of package IDPmisc
You can try this: par(mfcol=c(5,2)) lapply(df1, function(x){ nm <- names(eval(as.list(sys.call(-1))[[2]]))[as.numeric(gsub("[^0-9]", "", deparse(substitute(x))))] plot(x, main = nm) }) On Thu, Nov 19, 2009 at 10:27 AM, Bjarke Christensen <Bjarke.Christensen at sydbank.dk> wrote:> > Hi, > > When using lapply (or sapply) to loop over a list, can I somehow access the > index of the list from inside the function? > > A trivial example: > > df1 <- split( > ? x=rnorm(n=100, sd=seq(from=1, to=10, each=10)), > ? f=letters[seq(from=1, to=10, each=10)] > ?) > str(df1) > #List of 10 > # $ a: num [1:10] -0.801 0.418 1.451 -0.554 -0.578 ... > # $ b: num [1:10] -2.464 0.279 4.099 -2.483 1.921 ... > # $ c: num [1:10] -1.14 -1.773 2.512 -2.072 -0.904 ... > # $ d: num [1:10] 2.109 1.243 0.627 -2.343 -6.071 ... > #... > par(mfcol=c(5,2)) > lapply(df1, plot) > > This plots each element of the list, but the label on the vertical axis is > X[[0L]] (as expected from the documentation in ?lapply). I'd like the > heading for each plot to be the name of that item in the list. This can be > achieved by using a for-loop: > > for (i in names(df1)) plot(df1[[i]], ylab=i) > > but can it somehow be achieved bu using lapply? I would be hoping for > something like > > lapply(df1, function(x) plot(x, ylab=parent.index())) > > or some way to parse the index number out of the call, using match.call() > or something like that. > > Thanks in advance for any comments, > Bjarke Christensen > > ______________________________________________ > 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
Bengoechea Bartolomé Enrique (SIES 73)
2009-Nov-20 12:19 UTC
[R] Accessing list names in lapply
Yet another possibility is to iterate on both values and names simultaneously using mapply(): df1 <- split( x=rnorm(n=100, sd=seq(from=1, to=10, each=10)), f=letters[seq(from=1, to=10, each=10)] ) mapply(function(x, y) plot(x, ylab=y), df1, names(df1)) Enrique -----Original Message----- Date: Thu, 19 Nov 2009 13:27:08 +0100 From: Bjarke Christensen <Bjarke.Christensen at sydbank.dk> Subject: [R] Accessing list names in lapply To: r-help at r-project.org Message-ID: <OF5533F0B9.99F78AB0-ONC1257673.004273AE-C1257673.004466FF at bdpnet.dk> Content-Type: text/plain; charset=US-ASCII Hi, When using lapply (or sapply) to loop over a list, can I somehow access the index of the list from inside the function? A trivial example: df1 <- split( x=rnorm(n=100, sd=seq(from=1, to=10, each=10)), f=letters[seq(from=1, to=10, each=10)] ) str(df1) #List of 10 # $ a: num [1:10] -0.801 0.418 1.451 -0.554 -0.578 ... # $ b: num [1:10] -2.464 0.279 4.099 -2.483 1.921 ... # $ c: num [1:10] -1.14 -1.773 2.512 -2.072 -0.904 ... # $ d: num [1:10] 2.109 1.243 0.627 -2.343 -6.071 ... #... par(mfcol=c(5,2)) lapply(df1, plot) This plots each element of the list, but the label on the vertical axis is X[[0L]] (as expected from the documentation in ?lapply). I'd like the heading for each plot to be the name of that item in the list. This can be achieved by using a for-loop: for (i in names(df1)) plot(df1[[i]], ylab=i) but can it somehow be achieved bu using lapply? I would be hoping for something like lapply(df1, function(x) plot(x, ylab=parent.index())) or some way to parse the index number out of the call, using match.call() or something like that. Thanks in advance for any comments, Bjarke Christensen
Maybe Matching Threads
- [LLVMdev] Strong post-dominance in LLVM?
- extract values
- [LLVMdev] Deriving undefined behavior from nsw/inbounds/poison for scalar evolution
- ScalarEvolution "add nsw" question
- [LLVMdev] Deriving undefined behavior from nsw/inbounds/poison for scalar evolution