Skip to content

Consistency with math? #4

@mikmart

Description

@mikmart

As André Gillibert wrote on r-devel, it would seem desirable for ifelse to behave similarly to it's mathematical cousin expression test * yes + (1 - test) * no.

Currently at least the handling of various combinations of scalar, matrix and vector inputs is quite different:

library(ifelse)

math_ifelse <- function(test, yes, no) {
  storage.mode(test) <- "logical"
  test * yes + (1 - test) * no
}

scalar <- 0
vector <- 0:1
matrix <- matrix(0:3, 2, 2)

ifelse1(scalar, vector, matrix)
#> [1] 0
math_ifelse(scalar, vector, matrix)
#>      [,1] [,2]
#> [1,]    0    2
#> [2,]    1    3

ifelse1(scalar, matrix, vector)
#> [1] 0
math_ifelse(scalar, matrix, vector)
#>      [,1] [,2]
#> [1,]    0    0
#> [2,]    1    1

ifelse1(vector, matrix, scalar)
#> [1] 0 1
math_ifelse(vector, matrix, scalar)
#>      [,1] [,2]
#> [1,]    0    0
#> [2,]    1    3

ifelse1(vector, scalar, matrix)
#> [1] 0 0
math_ifelse(vector, scalar, matrix)
#>      [,1] [,2]
#> [1,]    0    2
#> [2,]    0    0

ifelse1(matrix, vector, scalar)
#> [1] 0 1 0 1
math_ifelse(matrix, vector, scalar)
#>      [,1] [,2]
#> [1,]    0    0
#> [2,]    1    1

ifelse1(matrix, scalar, vector)
#> [1] 0 0 0 0
math_ifelse(matrix, scalar, vector)
#>      [,1] [,2]
#> [1,]    0    0
#> [2,]    0    0

Created on 2025-08-02 with reprex v2.1.1

Related to #1.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions