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

Duncan Murdoch murdoch.duncan at gmail.com
Fri Dec 26 13:00:59 CET 2014


On 25/12/2014 11:30 PM, Mike Miller wrote:
> On Thu, 25 Dec 2014, Bert Gunter wrote:
> 
>> You persist in failing to read the docs!
> 
> "the docs" -- do those exclude those I have been quoting and linking to?
> 
>> Moreover, neither Hadley Wickham, nor anyone else, is the authoritative 
>> source for R usage (other than for the (many!) packages he, himself has 
>> authored). R's Help pages and manuals -- and ultimately the source code 
>> -- are the only such source.
> 
> Very pendantic.  Are you saying that Hadley Wickham's claim was incorrect? 
> To repeat, he said that this would return TRUE if x were a vector:
> 
> is.atomic(x) || is.list(x)
> 
> If you think that is wrong, I'd be interested to know more about that.
> 
> 
>> ?factor says in its very first line:
>>
>> "The function factor is used to encode a **vector** as a factor (the 
>> terms ‘category’ and ‘enumerated type’ are also used for factors)...." 
>> (emphasis added)
> 
> So what?  Are you saying that a factor *is* a vector?  I quoted this 
> before, but I'll repeat it here -- from the third paragaraph of the 
> Details section of ?vector:
> 
>     Note that factors are _not_ vectors; ‘is.vector’ returns ‘FALSE’
>     and ‘as.vector’ converts a factor to a character vector for ‘mode
>     = "any"’.
> 
> I guess that is an "authoritative source" by your criteria even though it 
> isn't in the first line of the page.

That page documents a function that is named poorly.  "is.vector"
doesn't test for vectors in the sense used in most other places, it
tests for a "vector of the specified mode having no attributes other
than names".  The page also points out a third meaning for the word,
i.e. "the formal class "vector" in the methods package".

So all your confusion is somewhat understandable, but it's still tiresome.

Duncan Murdoch

> 
> 
>>> f <- factor (letters[1:3])
>>> f
>> [1] a b c
>> Levels: a b c
>>
>>> attributes(f)
>> $levels
>> [1] "a" "b" "c"
>>
>> $class
>> [1] "factor"
>>
>>> is.vector(f)
>> [1] FALSE
>>
>>> attributes(f) <- NULL
>>
>>> f
>> [1] 1 2 3
>>> is.vector(f)
>> [1] TRUE
> 
> And your point is what?  Yes, we can convert between different kinds of 
> objects.  Are you saying that a factor *is* a vector because you can 
> coerce it into a vector by removing its attributes?
> 
> I do think it is very central to this discussion that attributes(x) <- 
> NULL makes x into a vector, and that is not true just for factors, but 
> also matrices, as you showed me earlier.  Following your lead, this is 
> another example:
> 
>> b <- 1:4
> 
>> attr(b, "dim") <- c(2,2)
> 
>> is.matrix(b)
> [1] TRUE
> 
> Does that mean that "a matrix is a vector"?  Not for me, but it does make 
> it easy to see how that concept helps people to understand the internal 
> workings of R.  Gabor Grothendieck wrote, "I think its the idea that in R 
> all data objects are vectors (for some notion of vector) in the sense that 
> all Lisp objects are lists, all APL objects are arrays and all tcl objects 
> are character strings."  That's how I've been thinking about it, too, but 
> I'm not sure that *all* data objects are vectors in this sense.  If that 
> were the case, the Wickham test would always return TRUE.
> 
> 
>> Don't you think it's time to call a halt to this?
> 
> You go first.
> 
> Mike
>



More information about the R-help mailing list