данные.таблица fifelse выдает неправильное предупреждение?

#r #data.table #warnings

#r #data.table #предупреждения

Вопрос:

Я обнаружил разницу в предупреждениях, используя fifelse из data.table библиотеки:

 set.seed(123)
df <- data.table(ID = rep(1:10,each = 2),x = sample(c(1,NA),20,replace = T))

test1 <- df[,fifelse(any(!is.na(x)),max(x,na.rm = T),as.numeric(NA)),by = ID]
 

выдает предупреждение:

Предупреждающие сообщения 1: В max(x, na.rm = T): нет не пропущенных аргументов до max; возврат -Inf 2: В max(x, na.rm = T): нет не пропущенных аргументов до max; возврат -Inf

в то время как:

 test2 <- df[,ifelse(any(!is.na(x)),max(x,na.rm = T),as.numeric(NA)),by = ID]
 

нет. И два результата идентичны:

 identical(test1,test2)
[1] TRUE
 

И в результате нет -Inf. Что это значит?

Комментарии:

1. Просто предположение. Сообщение об ошибке поступает от функции max(). Из этого я бы сделал вывод, что в fifelse функция max() выполняется для всех групп, даже если условие any(!is.na (x)) является ЛОЖНЫМ, в то время как с ifelse оно выполняется только тогда, когда оно ИСТИННО?

Ответ №1:

Может быть, лучше использовать if/else , поскольку входные данные равны length 1

 df[, if(any(!is.na(x))) max(x, na.rm = TRUE) else NA_real_, by = ID]