2014-12-04 7 views
1

Когда я продлить вектор difftimes другого объектом difftime, то представляется, что единица добавленного элемента игнорируется и переопределена без преобразования:R добавляя к вектору difftime забывает о единицах

> t = Sys.time() 
> d = difftime(c((t+1), (t+61)), t) 
> d 
Time differences in secs 
[1] 1 61 

> difftime(t+61, t) 
Time difference of 1.016667 mins 

> d[3] = difftime(t+61, t) 
> d 
Time differences in secs 
[1] 1.000000 61.000000 1.016667 
> as.numeric(d) 
[1] 1.000000 61.000000 1.016667 

В этом находится в R 3.1.0. Есть ли разумное объяснение этому поведению? Я просто хотел сохранить некоторые временные различия таким образом для последующего использования и не ожидал этого вообще. Я не нашел это документировано в любом месте ..

Хорошо, сейчас я просто помогаю себе с указанием всегда единицы:

> d[3] = difftime(t+61, t, unit="secs") 
> d 
Time differences in secs 
[1] 1 61 61 
+0

Это поведение R является супер плохо! Я внезапно чувствую себя намного хуже о жизни, после этого укусил меня. – rescdsk

+1

Я также считаю, что это заслуживает исправления или, по крайней мере, предупреждения в документации. – laubbas

ответ

0

От help("difftime")

Если единицы = «авто «выбирается подходящий набор единиц, самый большой (исключая« недели »), в котором все абсолютные различия больше единицы.

units = "auto" по умолчанию. Таким образом, для разности 1 и 61 секунд, если вы должны были выбрать минуты,

difftime(c((t+1), (t+61)), t, units = "min") 
# Time differences in mins 
# [1] 0.01666667 1.01666667 

Один из них меньше, чем один, так что по умолчанию, так как вы не указать единицы R выбрал их для вас в соответствии с выше. Кроме того, блоки сохраняются с объектом

d <- difftime(c((t+1), (t+61)), t) 
units(d) 
# [1] "secs" 

Но вы можете изменить единицы измерения с units<-

d[3] <- difftime(t+61, t) 
d 
# Time differences in mins 
# [1] 0.01666667 1.01666667 1.01666667 
units(d) <- "secs" 
d 
# Time differences in secs 
# [1] 1 61 61 
+0

Хорошо, спасибо, это имеет смысл. Таким образом, единицы являются всего лишь атрибутом вектора, который не проверяется при назначении нового значения. Я предполагаю, что я ожидал, что это задание будет более умным - ведь есть довольно некоторое преобразование типа, когда я добавляю строку к числовому вектору. – laubbas

+0

Вы можете изменить единицы измерения с помощью единиц (d) <- "mins" ', и он будет пересчитан –