On Wed, 24 Dec 2014, Bert Gunter wrote:
You are again misinterpreting because you have not read the docs,
although this time I will grant that they are to some extent misleading.
First of all, a matrix _IS_ a vector:
a <- matrix(1:4, 2,2)
a[3] ## vector indexing works because it is a vector
[1] 3
In fact, a matrix (or array) is a vector with a "dim" attribute. This
is documented in ?matrix:
"is.matrix returns TRUE if x is a vector and has a "dim" attribute of
length 2) and FALSE otherwise."
But a vector has no such attribute, so a matrix is not a vector which is
why you see this:
a <- matrix(1:4, 2,2)
is.vector(a)
[1] FALSE
Of course the matrix can be coerced back into a vector just as the vector
was coerced into a matrix:
b <- as.vector(a)
is.vector(b)
[1] TRUE
Your confusion arises because, despite its name, is.vector() does not
actually test whether something "is" a vector (after all these are all
abstractions; what it "is" is contents of memory, implemented as a
linked list or some such). ?is.vector tells you:
"is.vector returns TRUE if x is a vector of the specified mode having
no attributes other than names. It returns FALSE otherwise."
So that means that a vector in R has no attributes other than names.
An array has a "dim" attribute, so is.vector() returns FALSE on it. But
it actually _is_ ("behaves like") a vector (in column major
order,actually).
An array is a vector with additional attributes which cause it to be an
array rather than a vector. This is why R says FALSE when we query it
about an array using is.vector().
Now you may complain that this is confusing and I would agree. Why is it
this way? I dunno -- probably due to historical quirks -- evolution is
not necessarily orderly. But that's the way it is; that's the way it's
documented; and tutorials will tell you about this (that's how I
learned). So please stop guessing and intuiting and read the docs to
understand how things work.
I don't think it is confusing. This is the kind of behavior I'm used to
from other programs like Octave/MATLAB. A vector is just an ordered list
of numbers. Those numbers can be put into matrices or higher-dimensional
arrays, but they then become something more than just a vector. A vector
like 1:4 becomes a 2x2 matrix when we do matrix(1:4, 2,2) such that the
number 3 which was just the third element before (and still is) is now
also the [1,2] element of a matrix. It didn't have that before, back when
it was a vector, but now that it has become something more than a vector,
it has that new property. We can take that away using as.vector().
In many situations the behavior of the R vector and the same values in a
matrix format will be very different:
a <- 1:4
b <- matrix(a, 2,2)
a %*% a
[,1]
[1,] 30
b %*% b
[,1] [,2]
[1,] 7 15
[2,] 10 22
b %*% t(b)
[,1] [,2]
[1,] 10 14
[2,] 14 20
a %*% t(a)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 2 4 6 8
[3,] 3 6 9 12
[4,] 4 8 12 16
That is not true in ave(), as I showed earlier, because it uses the vector
ordering of elements in the x matrix or array (what one would get from
as.vector()) to form the correspondence with the factor.
I get your idea, but I don't think it is correct to say "a matrix is a
vector." Rather, I would say that there is a standard way in which one
can create a one-to-one correspondence between the elements of a matrix of
given dimensions and the elements of a vector. I believe this is usually
called "fortran indexing," or at least that is what it is called in
Octave. The same thing is done with vectorization and the vec() operator
in mathematics:
http://en.wikipedia.org/wiki/Vectorization_(mathematics)
But in math as in computing, we wouldn't say that a matrix *is* a vector.
If vec(A) = v, that does not mean that A = v. In R, it looks like
as.vector() can do what vec() does, and more.
Mike
--
Michael B. Miller, Ph.D.
University of Minnesota
http://scholar.google.com/citations?user=EV_phq4AAAAJ
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.