Функции R возвращают последнее оцененное значение, оцененное во время их вызова, даже без явного вызова return
(см. этот ответ для более подробной информации); поэтому, где NA
является последним значением, оцененным в вашей функции if_state
(так как оно находится вне потока управления if-else if
и поэтому всегда будет оцениваться), оно всегда вернет NA
, даже когда if
и else if
условия верны. Чтобы ваша функция работала так, как вы ожидаете, вам нужно переместить NA
в оператор else:
if_state <- function(x,y) {
if (x == min(x) && y == max(y)) {
"good"
} else if (max(x)/2 == y[which(y == 15)]/3) {
"y==5"
} else {
NA
}
}
Обратите внимание, что при использовании dplyr тестирование нескольких условий для определения возвращаемого значения часто выполняется более кратко с помощью case_when
:
test %>% mutate(class = case_when(
x == min(x) && y == max(y) ~ "good",
max(x)/2 == y[which(y == 15)]/3 ~ "y == 5",
TRUE ~ NA_character_
))
Редактировать: на основании разъяснений ОП и помощи eipi10, вот последняя функция:
if_state = function(x, y) {
case_when(x == min(x) && y == max(y) ~ "good",
x == max(x)/2 & y/3 == 5 ~ "y==5",
TRUE ~ NA_character_)
}