[R] ave(x, y, FUN=length) produces character output when x is character

Mike Miller mbmiller+l at gmail.com
Thu Dec 25 19:57:05 CET 2014


On Thu, 25 Dec 2014, peter dalgaard wrote:

>
>> On 25 Dec 2014, at 08:15 , Mike Miller <mbmiller+l at gmail.com> wrote:
>>
>>>
>>> "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.
>
> Wrong. Read carefully. There are
>
> - vectors
> - vectors having no attributes other than names

You are right.  I was being difficult about the meaning of "is.vector()".

But would you also say that a matrix is a vector?

I was going to ask a question about it how to test that an object is a 
vector, but then I found this:

"is.vector() does not test if an object is a vector. Instead it returns 
TRUE only if the object is a vector with no attributes apart from names. 
Use is.atomic(x) || is.list(x) to test if an object is actually a vector."

>From here:

http://adv-r.had.co.nz/Data-structures.html#vectors

> a <- c(1,2,3,4)

> names(a) <- LETTERS[1:4]

> attr(a, "vecinfo") <- "yes, I'm a vector"

> a
A B C D
1 2 3 4
attr(,"vecinfo")
[1] "yes, I'm a vector"

> attributes(a)
$names
[1] "A" "B" "C" "D"

$vecinfo
[1] "yes, I'm a vector"

> is.vector(a)
[1] FALSE

> is.atomic(a) || is.list(a)
[1] TRUE

But then we also see this:

> b <- matrix(1:4, 2,2)

> is.atomic(b) || is.list(b)
[1] TRUE


"It is common to call the atomic types ‘atomic vectors’, but note that 
is.vector imposes further restrictions: an object can be atomic but not a 
vector (in that sense)."

https://stat.ethz.ch/R-manual/R-devel/library/base/html/is.recursive.html

I think a matrix is always atomic.  So a matrix is "not a vector (in that 
sense)," but "is.matrix returns TRUE if x is a vector and has a 'dim' 
attribute of length 2."

I do think I get what is going on with this, but why should I buy into 
this conceptualization?  Why is it better to say that a matrix *is* a 
vector than to say that a matrix *contains* a vector?  The latter seems to 
be the more common way of thinking but such things.  Even in R you've had 
to construct two different definitions of "vector" to deal with the 
inconsistency created by the "matrix is a vector" way of thinking.  So 
there must be something really good about it that I am not understanding 
(and I'm not being facetious or ironic!)

Mike


More information about the R-help mailing list