R-lang throws the warning, the condition has length > 1 and only the first element will be used because if statement is not vectorized. In it’s place you need to use ifelse or you can use any() function.

Suppose you have a vector –

a <- c(1,2,3,0,0,4,5,0,0,1)

And you want to do an operation on it using if statement –

w<-function(a){
if (a>0){
a/sum(a)
}
else 1
}

What we are trying to achieve is updating the values of vector a to value / sum of all values, if the value is greater than 0 otherwise set it to 1. So, the above vector should return –

// sum(a) = 1+2+3+0+0+4+5+0+0+1 = 16
a <- c(1/16, 2/16, 3/16, 1, 1, 4/16, 5/16, 1, 1, 1/16)

But the code will return a warning message –

Warning message:
In if (a > 0) { :
the condition has length > 1 and only the first element will be used

Solution

There are 2 ways of doing this – using any() or ifelse

w <- function(a){
if (any(a>0)){
a/sum(a)
}
else 1
}
w <- function(a){
ifelse(a>0,a/sum(a),1)
}

Live Demo

Demo might not work in private window (incognito)

Tagged in:

,