Hi all, I'm not sure if this is a feature or a bug (and I did read the FAQ and the posting guide, but am still not sure). Some of my students have been complaining and I thought I just might ask: Let K be a vector of length k. If one types dim(K), you get NULL rather than [1] k. Is this logical? Here's the way I explain it (and maybe someone can provide a more accurate explanation of what's going on): R has several types of scalar (atomic) values, the most common of which are numeric, integer, logical, and character values. Arrays are data structures which hold only one type of atomic value. Arrays can be one-dimensional (vectors), two-dimensional (matrices), or n-dimensional. (We generally use arrays of n-1 dimensions to populate n-dimensional arrays -- thus, we generally use vectors to populate matrices, and matrices to populate 3-dimensional arrays, but could use any array of dimension < n-1 to populate an n-dimensional array.) It logically follows that when one does dim() on a vector, one should *not* get NULL, but should get the length of the vector (which one *could* obtain by doing length(), but I think this is less logical). I think that R should save length() for lists that have objects of different dimension and type. Does this make sense? Or is there a better explanation? Thanks in advance! Yours, Olivia Lau
Olivia Lau <olau <at> fas.harvard.edu> writes: : : Hi all, : : I'm not sure if this is a feature or a bug (and I did read the : FAQ and the posting guide, but am still not sure). Some of my : students have been complaining and I thought I just might ask: : Let K be a vector of length k. If one types dim(K), you get : NULL rather than [1] k. Is this logical? : : Here's the way I explain it (and maybe someone can provide a : more accurate explanation of what's going on): R has several : types of scalar (atomic) values, the most common of which are : numeric, integer, logical, and character values. Arrays are : data structures which hold only one type of atomic value. : Arrays can be one-dimensional (vectors), two-dimensional : (matrices), or n-dimensional. : : (We generally use arrays of n-1 dimensions to populate : n-dimensional arrays -- thus, we generally use vectors to : populate matrices, and matrices to populate 3-dimensional : arrays, but could use any array of dimension < n-1 to populate : an n-dimensional array.) : : It logically follows that when one does dim() on a vector, one : should *not* get NULL, but should get the length of the vector : (which one *could* obtain by doing length(), but I think this is : less logical). I think that R should save length() for lists : that have objects of different dimension and type. : In R, vectors are not arrays: R> v <- 1:4 R> dim(v) NULL R> is.array(v) [1] FALSE R> a <- array(1:4) R> dim(a) [1] 4 R> is.array(a) [1] TRUE
On Friday 21 January 2005 06:35, Gabor Grothendieck wrote:> In R, vectors are not arrays: > > R> v <- 1:4 > R> dim(v) > NULL > R> is.array(v) > [1] FALSE > > R> a <- array(1:4) > R> dim(a) > [1] 4 > R> is.array(a) > [1] TRUEIs this a feature which is useful in some applications? IMHO the difference between vectors and 1-dimensional arrays is really annoying and I had already several bugs in my code, because I mixed these up. Is it possible in future versions of R that R does not differentiate between vectors and 1-dimensional arrays (e.g. by treating all vectors as 1-dimensional arrays)? Arne
Arne Henningsen wrote:> On Friday 21 January 2005 06:35, Gabor Grothendieck wrote: > >>In R, vectors are not arrays: >> >>R> v <- 1:4 >>R> dim(v) >>NULL >>R> is.array(v) >>[1] FALSE >> >>R> a <- array(1:4) >>R> dim(a) >>[1] 4 >>R> is.array(a) >>[1] TRUE > > > Is this a feature which is useful in some applications? > IMHO the difference between vectors and 1-dimensional arrays is really > annoying and I had already several bugs in my code, because I mixed these up. > Is it possible in future versions of R that R does not differentiate between > vectors and 1-dimensional arrays (e.g. by treating all vectors as > 1-dimensional arrays)?No, that would break huge amounts of code! See ?"[" and learn how to use its argument "drop". Uwe Ligges> Arne > > ______________________________________________ > 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
Perhaps you could just write dim(array(x)) when you want that effect. That has the advantage of not requiring any change to R and preserving the meaning of dim(x) as retrieving the dim attribute. Date: Fri, 21 Jan 2005 10:00:01 -0500 From: Olivia Lau <olau at fas.harvard.edu> To: Uwe Ligges <ligges at statistik.uni-dortmund.de>,Arne Henningsen <ahenningsen at email.uni-kiel.de> Cc: <r-help at stat.math.ethz.ch> Subject: Re: [R] dim vs length for vectors What I was proposing doesn't require a lot of programming. Just whenever you call dim(), it does length() if the object is a vector and returns it in the format: R> a <- 1:12 R> dim(a) [1] 12 This means that you can provide a unified introduction to data structures that take only one type of atomic value (and generally call these structures "arrays"). What I call a "one dimensional array" only has one dim attribute and hence would use a[4] for extraction (for example), which is consistent with the usage for "[" (to my understanding). That way, when you introduce "[" and arrays at the same time, you can tell beginners: 1) Run dim() 2) If there's one dim, use [ ]; if there are 2 dims, use [ , ]; if there are 3 dims, you use [ , , ]. This is conceptually easy for a beginner and avoids a bit of frustration. If I need to initiate an empty vector for example I use R> a <- array() It just looks like the difference between a 1-d array (which doesn't exist as far as I can tell) and a vector is semantic, and I think that R would be more logical if they were treated as the same thing. This doesn't mean changing the way the is.array(), is.vector(), <-, etc functions work, but just changing dim().
I think you can assign a dim attribute to a vector to make a 1-d array.> v <- 1:10 > dim(v)NULL>dim(v) <- 10 >dim(v)[1] 10 Also,> u <- array(1:10,dim=10) > u[1] 1 2 3 4 5 6 7 8 9 10> dim(u)[1] 10 Perhaps the philosophy is that vectors are the basic, underlying type, and arrays (including 1-d arrays) carry additional structure information. So arrays are vectors, if you forget the "dim" attribute, but vectors are not any particular type of array. Reid Huntsinger -----Original Message----- From: r-help-bounces at stat.math.ethz.ch [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Olivia Lau Sent: Friday, January 21, 2005 10:00 AM To: Uwe Ligges; Arne Henningsen Cc: r-help at stat.math.ethz.ch Subject: Re: [R] dim vs length for vectors>> IMHO the difference between vectors and 1-dimensional arrays >> is really annoying and I had already several bugs in my code, >> because I mixed these up. >> Is it possible in future versions of R that R does not >> differentiate between vectors and 1-dimensional arrays (e.g. >> by treating all vectors as 1-dimensional arrays)? > > No, that would break huge amounts of code! > > See ?"[" and learn how to use its argument "drop".What I was proposing doesn't require a lot of programming. Just whenever you call dim(), it does length() if the object is a vector and returns it in the format: R> a <- 1:12 R> dim(a) [1] 12 This means that you can provide a unified introduction to data structures that take only one type of atomic value (and generally call these structures "arrays"). What I call a "one dimensional array" only has one dim attribute and hence would use a[4] for extraction (for example), which is consistent with the usage for "[" (to my understanding). That way, when you introduce "[" and arrays at the same time, you can tell beginners: 1) Run dim() 2) If there's one dim, use [ ]; if there are 2 dims, use [ , ]; if there are 3 dims, you use [ , , ]. This is conceptually easy for a beginner and avoids a bit of frustration. If I need to initiate an empty vector for example I use R> a <- array() It just looks like the difference between a 1-d array (which doesn't exist as far as I can tell) and a vector is semantic, and I think that R would be more logical if they were treated as the same thing. This doesn't mean changing the way the is.array(), is.vector(), <-, etc functions work, but just changing dim(). Yours, Olivia Lau ______________________________________________ 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
Sorry, I meant as.array, not array. Date: Fri, 21 Jan 2005 12:21:39 -0500 (EST) From: Gabor Grothendieck <ggrothendieck at myway.com> To: <olau at fas.harvard.edu>, <ligges at statistik.uni-dortmund.de>, <ahenningsen at email.uni-kiel.de> Cc: <r-help at stat.math.ethz.ch> Subject: Re: [R] dim vs length for vectors Perhaps you could just write dim(array(x)) when you want that effect. That has the advantage of not requiring any change to R and preserving the meaning of dim(x) as retrieving the dim attribute. Date: Fri, 21 Jan 2005 10:00:01 -0500 From: Olivia Lau <olau at fas.harvard.edu> To: Uwe Ligges <ligges at statistik.uni-dortmund.de>,Arne Henningsen <ahenningsen at email.uni-kiel.de> Cc: <r-help at stat.math.ethz.ch> Subject: Re: [R] dim vs length for vectors What I was proposing doesn't require a lot of programming. Just whenever you call dim(), it does length() if the object is a vector and returns it in the format: R> a <- 1:12 R> dim(a) [1] 12 This means that you can provide a unified introduction to data structures that take only one type of atomic value (and generally call these structures "arrays"). What I call a "one dimensional array" only has one dim attribute and hence would use a[4] for extraction (for example), which is consistent with the usage for "[" (to my understanding). That way, when you introduce "[" and arrays at the same time, you can tell beginners: 1) Run dim() 2) If there's one dim, use [ ]; if there are 2 dims, use [ , ]; if there are 3 dims, you use [ , , ]. This is conceptually easy for a beginner and avoids a bit of frustration. If I need to initiate an empty vector for example I use R> a <- array() It just looks like the difference between a 1-d array (which doesn't exist as far as I can tell) and a vector is semantic, and I think that R would be more logical if they were treated as the same thing. This doesn't mean changing the way the is.array(), is.vector(), <-, etc functions work, but just changing dim().