[Rd] ifelse
Prof Brian Ripley
ripley at stats.ox.ac.uk
Tue Aug 19 07:37:42 CEST 2008
Another way of looking at this is that ifelse(TRUE, character(0), "") asks
for a length-one result containing the first element of yes=character(0),
and character(0)[1] is NA_character_
I suspect if(TRUE) character(0) else "" was intended.
On Mon, 18 Aug 2008, Marc Schwartz wrote:
> on 08/18/2008 06:35 PM Heikki Kaskelma wrote:
>> I find it slightly surprising, that
>>
>> ifelse(TRUE, character(0), "")
>>
>> returns NA instead of character(0).
>>
>> [WNT 2.6.2 Patched]
>
> Time to upgrade... :-)
>
>
> The same behavior is in:
>
> R version 2.7.2 beta (2008-08-16 r46368)
>
>
> The reason for this is that the internal code for ifelse() has:
>
> if (any(test[!nas]))
> ans[test & !nas] <- rep(yes, length.out = length(ans))[test &
> !nas]
>
> where the key code is:
>
> rep(yes, length.out = length(ans))
>
> In this case, 'yes' is character(0) and 'ans' is TRUE.
>
> Thus, you get:
>
> > rep(character(0), length.out = length(TRUE))
> [1] NA
>
>
> This behavior is documented in ?rep, where in the Details section you
> will find:
>
> "If x has length zero and length.out is supplied and is positive, the
> values are filled in using the extraction rules, that is by an NA of the
> appropriate class for an atomic vector (0 for raw vectors) and NULL for
> a list. "
>
> Thus:
>
>> class(rep(character(0), length.out = length(TRUE)))
> [1] "character"
>
>
> which shows that the NA that is returned is of class character, which is
> the class for character(0).
>
> HTH,
>
> Marc Schwartz
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-devel
mailing list