Joe W. Byers
2006-Oct-24 10:58 UTC
[R] Help with understanding [[]] [] array, list, matrix referencing
Hi all, I would greatly appreciate some help understanding how R references arrays, matrices, lists, and objects using [[]] and []. I have read the R guides and several tutorials but I am not the fastest kid on the block so I am still having difficulty understanding this. For examples the following code produces a 5 element list of 2X5 random numbers that I then convert to a 2X5X5 matrix. cov<-matrix(c(.4,-.1,-.1,.3),nrow=2,ncol=2) rnds<-NULL; for (i in 1:5){ t1<-rnorm(5,cov) t2<-rnorm(5,cov) t3<-rbind(t1,t2) rnds[i]<-list(t3) } rnds.matrix<-array(unlist(rnds),dim=c(2,5,5)); To access the matrix rnds.matrix I use rnds.matrix[x,y,z]. This I understand. To access the list I user [[z]][x,y]. This I do not understand. I found by chance this reference notation in an old mailing list that helped me. I could use some help in knowing when to use [[]] referencing and when to use [] referencing. If there is a really good book, webpage, or link with explanation and examples I would appreciate you forwarding the the citation. Thank you Joe
David Barron
2006-Oct-24 11:09 UTC
[R] Help with understanding [[]] [] array, list, matrix referencing
Have you tried help("["), which gives a good explanation. On 24/10/06, Joe W. Byers <Joe-Byers at utulsa.edu> wrote:> Hi all, > > I would greatly appreciate some help understanding how R references > arrays, matrices, lists, and objects using [[]] and []. I have read the > R guides and several tutorials but I am not the fastest kid on the block > so I am still having difficulty understanding this. For examples the > following code produces a 5 element list of 2X5 random numbers that I > then convert to a 2X5X5 matrix. > cov<-matrix(c(.4,-.1,-.1,.3),nrow=2,ncol=2) > rnds<-NULL; > for (i in 1:5){ > t1<-rnorm(5,cov) > t2<-rnorm(5,cov) > t3<-rbind(t1,t2) > rnds[i]<-list(t3) > } > > rnds.matrix<-array(unlist(rnds),dim=c(2,5,5)); > > To access the matrix rnds.matrix I use rnds.matrix[x,y,z]. This I > understand. > > To access the list I user [[z]][x,y]. This I do not understand. I > found by chance this reference notation in an old mailing list that > helped me. > > I could use some help in knowing when to use [[]] referencing and when > to use [] referencing. If there is a really good book, webpage, or link > with explanation and examples I would appreciate you forwarding the the > citation. > > Thank you > Joe > > ______________________________________________ > R-help at stat.math.ethz.ch 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. >-- ================================David Barron Said Business School University of Oxford Park End Street Oxford OX1 1HP
Joe Byers
2006-Oct-24 11:31 UTC
[R] Help with understanding [[]] [] array, list, matrix referencing
David, Yes, I did. I just still do not get it. That is why I ask here. Hoping someone knew a step by step guide that I could look at. My trial and error approach takes me hours some days. I currently move most things in and out of data.frames where I can name the columns and reference with the $ and a subsetting function, but that is not always efficient. If I could understand the [ referencing better, my code would be more efficient and I think faster. Part of my problem is my SAS background where everything is a flat table and coding is really sloppy. A data step with a bunch of if-then-else to perform the calculation where as in matrix format like in R you do things more compactly. Not always easy to read but efficient and fast. I appreciate you help. Thank you Joe David Barron wrote:> Have you tried help("["), which gives a good explanation. > > > On 24/10/06, Joe W. Byers <Joe-Byers at utulsa.edu> wrote: >> Hi all, >> >> I would greatly appreciate some help understanding how R references >> arrays, matrices, lists, and objects using [[]] and []. I have read the >> R guides and several tutorials but I am not the fastest kid on the block >> so I am still having difficulty understanding this. For examples the >> following code produces a 5 element list of 2X5 random numbers that I >> then convert to a 2X5X5 matrix. >> cov<-matrix(c(.4,-.1,-.1,.3),nrow=2,ncol=2) >> rnds<-NULL; >> for (i in 1:5){ >> t1<-rnorm(5,cov) >> t2<-rnorm(5,cov) >> t3<-rbind(t1,t2) >> rnds[i]<-list(t3) >> } >> >> rnds.matrix<-array(unlist(rnds),dim=c(2,5,5)); >> >> To access the matrix rnds.matrix I use rnds.matrix[x,y,z]. This I >> understand. >> >> To access the list I user [[z]][x,y]. This I do not understand. I >> found by chance this reference notation in an old mailing list that >> helped me. >> >> I could use some help in knowing when to use [[]] referencing and when >> to use [] referencing. If there is a really good book, webpage, or link >> with explanation and examples I would appreciate you forwarding the the >> citation. >> >> Thank you >> Joe >> >> ______________________________________________ >> R-help at stat.math.ethz.ch 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. >> > >
Thomas Lumley
2006-Oct-24 14:21 UTC
[R] Help with understanding [[]] [] array, list, matrix referencing
On Tue, 24 Oct 2006, Joe W. Byers wrote:> following code produces a 5 element list of 2X5 random numbers that I > then convert to a 2X5X5 matrix. > cov<-matrix(c(.4,-.1,-.1,.3),nrow=2,ncol=2) > rnds<-NULL; > for (i in 1:5){ > t1<-rnorm(5,cov) > t2<-rnorm(5,cov) > t3<-rbind(t1,t2) > rnds[i]<-list(t3) > } > > rnds.matrix<-array(unlist(rnds),dim=c(2,5,5)); > > To access the matrix rnds.matrix I use rnds.matrix[x,y,z]. This I > understand. > > To access the list I user [[z]][x,y]. This I do not understand. I > found by chance this reference notation in an old mailing list that > helped me. >Yes, this can be confusing. One reason that it is confusing is that the rules appear to be different (though they aren't) for vectors and lists. The single bracket [ extracts a subvector, and the double bracket [[ extracts an element. That is, with a<-list(b=1,c=2,d=3) you can extracts the first element of a,> a[[1]][1] 1 or a sublist with the first two elements> a[1:2]$b [1] 1 $c [1] 2 or a sublist with just the first element> a[1]$b [1] 1 The same is true for numeric or character vectors, but there an element and a subvector of length one are the same, so the distinction between [[ and [ is harder to understand.> b<-1:10 > b[1:2][1] 1 2> b[1][1] 1> b[[1]][1] 1 -thomas