Skip to content

why sd() can be applied to character vector?

3 messages · Jinsong Zhao, R. Michael Weylandt, Brian Ripley

#
Hi there,

In the following example, sd() can be applied to a character vector. 
However, mean() can not be run in a similar way. Why?

I have read sd() man page, however, I don't find information about that 
behavior.

 > x <- as.character(1:10)
 > sd(x)
[1] 3.02765
 > mean(x)
[1] NA
Warning message:
In mean.default(x) : argument is not numeric or logical: returning NA

Regards,
Jinsong
#
On Sat, Oct 27, 2012 at 10:16 AM, Jinsong Zhao <jszhao at yeah.net> wrote:
Practically, I see

$R_HOME/src/library/stats/src/cov.c:633 has

x = PROTECT(coerceVector(x, REALSXP));

which seems to be responsible for the behavior you note (eventually
calling $R_HOME/src/main/util.c:1463), but mean.default catches the
character case early and returns NA_real_.

None of that explains the reasoning however and it does seem a little anomalous

Cheers,
Michael
#
On 27/10/2012 10:16, Jinsong Zhao wrote:
Well, it is there:

        x: a numeric vector or an R object which is coercible to one by
           ?as.vector?.

 > as.vector(x, 'numeric')
  [1]  1  2  3  4  5  6  7  8  9 10

And it is different from mean() because that is generic and allows many 
other forms of input, whereas for sd() one knows what to coerce to.