[R] need help in if else condition

Dénes Tóth toth@dene@ @end|ng |rom kogentum@hu
Wed Jul 10 18:14:21 CEST 2019



On 7/10/19 5:54 PM, Richard O'Keefe wrote:
> Expectation: ifelse will use the same "repeat vectors to match the longest"
> rule that other vectorised functions do.  So
> a <- 1:5
> b <- c(2,3)
> ifelse(a < 3, 1, b)
> => ifelse(T T F F F <<5>>, 1 <<1>>, 2 3 <<2>>)
> => ifelse(T T F F F <<5>>, 1 1 1 1 1 <<5>>, 2 3 2 3 2 <<5>>)
> => 1 1 2 3 2
> and that is indeed the answer you get.  Entirely predictable and consistent
> with
> other basic operations in R.
> 
> The only tricky thing I see is that R has
> a strict vectorised  ifelse(logical.vector, some.vector, another.vector)
> AND
> a non-strict non-vectorised if (logical.scalar) some.value else
> another.value
> AND
> a statement form if (logical.scalar) stmt.1; else stmt.2;

Just for the records, there is a further form:
`if`(logical.scalar, stmt.1, stmt.2)

The main problem with ifelse is that 1) it is very slow, and 2) the mode 
of its return value can be unintuitive or not too predictable (see also 
the Value and Warning sections of ?ifelse). One has to be very careful 
and ensure that 'yes' and 'no' vectors have the same class, because 
ifelse will not warn you at all:
 > ifelse(c(TRUE, TRUE), 1:2, LETTERS[1:2])
[1] 1 2
 > ifelse(c(TRUE, FALSE), 1:2, LETTERS[1:2])
[1] "1" "B"

For options instead of base::ifelse, you might find this discussion helpful:
https://github.com/Rdatatable/data.table/issues/3657


Cheers,
Denes


> 
> 
> On Thu, 11 Jul 2019 at 01:47, Eric Berger <ericjberger using gmail.com> wrote:
> 
>> For example, can you predict what the following code will do?
>>> a <- 1:5
>>> b <- c(2,3)
>>> ifelse( a < 3, 1, b)
>>
>>
>> On Wed, Jul 10, 2019 at 4:34 PM José María Mateos <chema using rinzewind.org>
>> wrote:
>>
>>> On Wed, Jul 10, 2019, at 04:39, Eric Berger wrote:
>>>> 1. The ifelse() command is a bit tricky in R. Avoiding it is often a
>> good
>>>> policy.
>>>
>>> You piqued my curiosity, can you elaborate a bit more on this?
>>>
>>> --
>>> José María (Chema) Mateos || https://rinzewind.org
>>>
>>> ______________________________________________
>>> R-help using 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.
>>>
>>
>>          [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help using 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.
>>
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help using 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.
>



More information about the R-help mailing list