2016-01-03 52 views
0

我一直在使用我的Window 7 RStudio環境(R版本3.2.3)中的腳本,並且我看到在命令行上看到的行爲與運行相同命令的行爲之間看起來有什麼區別從一個腳本內。下面是我在運行腳本的簡化版本:爲什麼這些R命令在腳本和命令行中表現不同?

if(!require(lubridate)) { install.packages("lubridate"); require(lubridate) } 
startDate <- "2015-12-21" 
endDate <- "2016-01-03" 

rDateStrangeness <- function(startDate = "2015-12-21", 
          endDate = "2016-01-03") { 
    sdate <- as.Date(startDate) 
    edate <- as.Date(endDate) 
    intervalDays <- seq(sdate, edate, by="days") 
    for(day in intervalDays) { 
     cat("day = ", day, ", as.character.Date(day) = ", 
      as.character.Date(day) , ", wday(day) = ", wday(day), "\n") 
    } 
} 

當我源代碼並運行rDateStrangeness(),我得到這樣的輸出:

day = 16790 , as.character.Date(day) = 16790 , wday(day) = 16790 
day = 16791 , as.character.Date(day) = 16791 , wday(day) = 16791 
day = 16792 , as.character.Date(day) = 16792 , wday(day) = 16792 
day = 16793 , as.character.Date(day) = 16793 , wday(day) = 16793 
day = 16794 , as.character.Date(day) = 16794 , wday(day) = 16794 
day = 16795 , as.character.Date(day) = 16795 , wday(day) = 16795 
day = 16796 , as.character.Date(day) = 16796 , wday(day) = 16796 
day = 16797 , as.character.Date(day) = 16797 , wday(day) = 16797 
day = 16798 , as.character.Date(day) = 16798 , wday(day) = 16798 
day = 16799 , as.character.Date(day) = 16799 , wday(day) = 16799 
day = 16800 , as.character.Date(day) = 16800 , wday(day) = 16800 
day = 16801 , as.character.Date(day) = 16801 , wday(day) = 16801 
day = 16802 , as.character.Date(day) = 16802 , wday(day) = 16802 
day = 16803 , as.character.Date(day) = 16803 , wday(day) = 16803 

但是,當我從命令運行相同的命令線

> sdate <- as.Date(startDate) 
> edate <- as.Date(endDate) 
> intervalDays <- seq(sdate, edate, by="days") 
> day <- intervalDays[1] 
> day.aschar <- as.character.Date(day) 

我看到這個輸出

> day.aschar 
[1] "2015-12-21" 
> class(day.aschar) 
[1] "character" 
> wday(day.aschar) 
[1] 2 

我期待着我在命令行上看到的行爲,但它看起來像循環訪問日期序列的方式與我所期望的不同。我想在循環中運行星期一,但它無法處理循環如何編入日期序列。

爲什麼我在命令行和腳本之間看到這些差異,我該如何解決這個問題?

回答

2

深入挖掘這個,它看起來像R在腳本中創建了一個數字迭代器,這不是我預期或想要的行爲。我發現在這個相關的帖子這個問題的答案:

Looping over a datetime object results in a numeric iterator

具體來說,我改變了循環稍微如下圖所示得到什麼我是後:

for(i in seq_along(intervalDays)) { 
    day <- intervalDays[i] 
    cat... 
} 
1

怎麼樣,如果你改變

intervalDays <- seq(sdate, edate, by="days") 

intervalDays <- as.character(seq(sdate, edate, by="days")) 

這裏我們基本上將for循環無法處理的日期向量更改爲循環可以管理的字符向量。

> for(day in intervalDays) { 
+  cat("day = ", day, ", as.character.Date(day) = ", 
+   as.character.Date(day) , ", wday(day) = ", wday(day), "\n") 
+ } 
day = 2015-12-21 , as.character.Date(day) = 2015-12-21 , wday(day) = 2 
day = 2015-12-22 , as.character.Date(day) = 2015-12-22 , wday(day) = 3 
day = 2015-12-23 , as.character.Date(day) = 2015-12-23 , wday(day) = 4 
day = 2015-12-24 , as.character.Date(day) = 2015-12-24 , wday(day) = 5 
day = 2015-12-25 , as.character.Date(day) = 2015-12-25 , wday(day) = 6 
day = 2015-12-26 , as.character.Date(day) = 2015-12-26 , wday(day) = 7 
day = 2015-12-27 , as.character.Date(day) = 2015-12-27 , wday(day) = 1 
day = 2015-12-28 , as.character.Date(day) = 2015-12-28 , wday(day) = 2 
day = 2015-12-29 , as.character.Date(day) = 2015-12-29 , wday(day) = 3 
day = 2015-12-30 , as.character.Date(day) = 2015-12-30 , wday(day) = 4 
day = 2015-12-31 , as.character.Date(day) = 2015-12-31 , wday(day) = 5 
day = 2016-01-01 , as.character.Date(day) = 2016-01-01 , wday(day) = 6 
day = 2016-01-02 , as.character.Date(day) = 2016-01-02 , wday(day) = 7 
day = 2016-01-03 , as.character.Date(day) = 2016-01-03 , wday(day) = 1 
+0

根據我最初的要求,完美的答案。我沒有提到的一件事是,我希望一天成爲循環內發生額外處理的日期。我最終使用我發佈的鏈接中描述的seq_along解決方案。 –

相關問題