A function using ifelse does not return a vector in R

I wrote a somewhat grotesque function that should just return a vector with two values.

For example, if you enter 33, you must return c(30, 40). It could not have been much easier.

return_a_range <- function(number){
    ans <-  ifelse(  (30  <= number & number <= 40), c(30, 40),
                     (ifelse( (40  < number  & number  <= 50), c(40, 50),
                              (ifelse( (50  < number  & number  <= 60), c(50, 60),
                                       (ifelse( (60  < number  & number  <= 70), c(60, 70),
                                                (ifelse( (70  < number  & number  <= 80), c(70, 80),
                                                         (ifelse( (80  < number  & number  <= 100), c(80, 100),                      
                                                                           ans <- c("NA"))))))))))))
    return(ans)}

return_a_range(33)

Why does this only return 30? How can I not return c(30, 40)? Why did R decide only to return the value in the first position of the vector?

EDIT
Although most of the answers relate to (justified!) That slap me to write a lousy expression ifelse, I think the real question was acknowledged and best answered by @MrFick in the comments below.

+4
source share
3 answers

:

> c(floor(33 / 10), ceiling(33 / 10))*10
[1] 30 40

- @Khashaa ( ):

f <- function(x) if(abs(x) >= 100) NA else c(floor(x / 10), floor(x/10) + 1)*10
f(44)
#[1] 40 50

f(40)
#[1] 40 50

, ifelse s.


, 30 - 40 40 ( , 40-50, ).

, , :

ff <- function(x) {
  if (abs(x) >= 100L) {
    NA 
  } else {
    y <- floor(x / 10L) * 10L
    if (x %% 10L == 0L) {
      c(y - 10L, y) 
    } else {
      c(y, y + 10L)
    }
  }
}

:

ff(40)
#[1] 30 40
ff(45)
#[1] 40 50

, , :

( x <- sample(-100:100, 3, F) )
#[1]  73  89 -97

lapply(x, ff)
#[[1]]
#[1] 70 80
#
#[[2]]
#[1] 80 90
#
#[[3]]
#[1] -100  -90

sapply(x, ff)
#     [,1] [,2] [,3]
#[1,]   70   80 -100
#[2,]   80   90  -90
+4

%/%, f2(40) ( ?)

f2 <- function(x) if(abs(x) >= 100) NA else c(x %/% 10, (x + 10) %/% 10) * 10
f2(40)
## [1] 40 50
+2

, , docendo ( , ), ( , - ):

return_a_range <- function(number){
  ans <-  ifelse(  (30  <= number & number <= 40), a<-c(30, 40),
                   (ifelse( (40  < number  & number  <= 50), a<-c(40, 50),
                            (ifelse( (50  < number  & number  <= 60), a<-c(50, 60),
                                     (ifelse( (60  < number  & number  <= 70), a<-c(60, 70),
                                              (ifelse( (70  < number  & number  <= 80), a<-c(70, 80),
                                                       (ifelse( (80  < number  & number  <= 100), a<-c(80, 100),                      
                                                                a <- c("NA"))))))))))))
  return(a)}

> return_a_range(33)
[1] 30 40

> return_a_range(62)
[1] 60 70

The only thing I did was save the vector in a variable aon each ifelse.

+1
source

Source: https://habr.com/ru/post/1568672/


All Articles