R функция min возвращаемый класс изменен с posixct на числовой, когда первый аргумент равен NULL - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу найти первую дату в нескольких столбцах данных (класс POSIXct), некоторые из которых могут быть пустыми, и я обнаружил, что min () иногда преобразует это число в числовое.

Итак, я начал исследовать, когда это происходит, и обнаружил, что это происходит, если первый аргумент оказывается NULL (не имеет значения, является ли какой-либо другой вход NULL).

Сравните следующие примеры:

min(as.POSIXct(c('2018-01-01','2018-01-02'), tz='UTC')) # Works as expected
min(as.POSIXct(c('2018-01-01','2018-01-02'), tz='UTC'), NULL) # Still fine
min(NULL, as.POSIXct(c('2018-01-01','2018-01-02'), tz='UTC')) # Returns 1514764800

Это ошибка?

Прямо сейчас я создал обходной путь, подобный этому:

min(if(is.null(df$timest1)) as.POSIXct('2099-12-31') else df$timest1,
    df$timest2, df$timest3)

Но в лучшем случае это выглядит ужасно, я ожидал, что min () проигнорирует все NULL

Есть какие-нибудь мысли о том, что я делаю что-то не так, или я должен сообщить об ошибке?

1 Ответ

0 голосов
/ 25 апреля 2018

min является универсальным S3, см. help("min"):

max и min являются универсальными функциями: методы могут быть определены для них индивидуально или с помощью универсальной группы Summary.

methods(min)
#no methods found
methods(Summary)
#[1] Summary.data.frame      Summary.Date            Summary.difftime        Summary.factor          Summary.numeric_version
#[6] Summary.ordered         Summary.POSIXct         Summary.POSIXlt        
#see '?methods' for accessing help and source code

Это показывает, что метод POSIXct определяется через универсальный шаблон группы.Теперь диспетчер S3 всегда учитывает класс только первого параметра (в противном случае вам нужен S4).

class(NULL)
#[1] "NULL"

Для класса "NULL" нет метода min.Таким образом, используется метод по умолчанию.Документация гласит:

По историческим причинам NULL принимается как эквивалент целого числа (0).

class(c(integer(0), as.POSIXct(c('2018-01-01','2018-01-02'), tz='UTC')))
#[1] "numeric"
class(min(NULL, as.POSIXct(c('2018-01-01','2018-01-02'), tz='UTC')))
#[1] "numeric"

Таким образом, все это задокументировано.Там нет ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...