2015-01-26 2 views
3

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

## 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 

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

ответ

4

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

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

+0

извините, так зачем нужна дополнительная скобка? Я бы подумал, что все до того, как труба будет передана as.numeric? – scottyaz

+0

Я не мог точно, зачем это нужно, но я бы хотел, чтобы он так себя вел. – zx8754

+0

@ zx8754 спасибо. Это все еще заставляет меня немного нервничать о неожиданных выводах с использованием труб. Возможно, кто-то еще лучше понимает. – scottyaz

3

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

as.Date ("2014-10-10")%>%
вычитают (as.Date ("2014-10-1"))%>%
as.numeric

# [1] 9 
+0

Почему бы просто не использовать '%>%' vs ''forward pipe operator'' (и почему блок« спойлер »?) – hrbrmstr

+1

@ Хенрик исправил трубы, после того, как трубы указали новую строку, ему потребовались дополнительные пробелы. – zx8754

0

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

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 

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