магриттр и объекты даты

Я только что заметил, что когда я вычитаю две даты друг из друга, а затем пытаюсь привести к числовому значению с помощью magrittr (%>%), я получаю дату, где, как если бы я просто заключал разницу дат в as.numeric(), я получаю разницу в количестве дней как числовое значение. См. простой пример ниже:

## version 1
as.Date("2014-10-10") - as.Date("2014-10-1") %>% as.numeric
## return value -->  "1970-01-10"

## version 2 (returning the value that I actually want)
as.numeric(as.Date("2014-10-10") - as.Date("2014-10-1"))
## return value --> 9

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


person scottyaz    schedule 26.01.2015    source источник


Ответы (3)


Попробуйте так, без дополнительных скобок сначала вычисляется труба, а затем вычитание.

(as.Date("2014-10-10") - as.Date("2014-10-1")) %>% as.numeric

person zx8754    schedule 26.01.2015
comment
извините, а зачем нужны лишние скобки? Я бы подумал, что все, что до пайпа, передается как.numeric? - person scottyaz; 26.01.2015
comment
Я не мог точно сказать, зачем это нужно, но я бы хотел, чтобы он вел себя именно так. - person zx8754; 26.01.2015
comment
@zx8754 спасибо. Это все еще заставляет меня немного нервничать из-за неожиданных результатов с использованием каналов. Возможно, у кого-то есть лучшее понимание. - person scottyaz; 26.01.2015

«Комплексное решение magrittr» также работает. Учитывая недавнее резкое увеличение использования операторов труб, довольно много людей отметили, что чрезмерное воздействие операторов труб (и псевдонимов) может повредить их глаза. Итак, блок спойлера.

as.Date("2014-10-10") %>%
вычесть(as.Date("2014-10-1")) %>%
as.numeric

# [1] 9
person Henrik    schedule 26.01.2015
comment
Почему бы просто не использовать %>% вместо forward pipe operator (и зачем спойлер?) - person hrbrmstr; 26.01.2015
comment
@Henrik исправил трубы, после них потребовались дополнительные пробелы, чтобы указать новую строку. - person zx8754; 26.01.2015

Особенно меня раздражает именование операций в magrittr. В данном примере я бы использовал причудливую трубу , работает как шарм

library(magrittr)
as.Date("2014-10-10") - as.Date("2014-10-1") %>% as.numeric
## [1] "1970-01-10"
as.Date("2014-10-10") - as.Date("2014-10-1") ->.; as.numeric(.)
## [1] 9

Идя еще дальше, вам понадобится 3 канала, чтобы получить недельную разницу в следующем примере (мне не нравится решение со скобками, которое представил @zx8754, потому что я думаю, что оно в первую очередь противоречит цели использования каналов), вы мог бы иметь это только с 1 bizarro.

as.Date("2014-10-10") %>% subtract(as.Date("2014-08-1")) %>% as.numeric %>% divide_by(7)
## [1] 10
as.Date("2014-10-10") - as.Date("2014-08-1") ->.; as.numeric(.)/7
## [1] 10

Я не говорю, что использование бизарро — это решение, я просто думаю, что магриттр можно улучшить, вот и все.

person RBA    schedule 14.02.2017