2017-05-12 3 views
1

両方のパッケージlubridateおよびdata.tableにはisoweekという名前の関数があります。R - isoweekのデフォルトパッケージは、使用方法によってどうして変わるのですか?

dplyrのmutateから "isoweek"を呼び出すと、デフォルトでdata.table :: isoweekが呼び出されるように見えます。たとえば、このコードでは、2014-12-29のISOWEEKは「0」です。

require(tidyverse) 
require(magrittr) 
require(lubridate) 
require(data.table) 

DATES <-data.frame(
    DATE= seq(
    as.Date("2014-12-22"), as.Date("2015-02-02"), by = "week")) %>% 
    mutate(ISOYEAR = isoyear(DATE), 
     LUBRIYEAR = lubridate::isoyear(DATE), 
     ISOWEEK = isoweek(DATE), 
     LUBRIWEEK = lubridate::isoweek(DATE), 
     DTWEEK3 = data.table::isoweek(DATE)) 

ただし、isoweekを単独で呼び出すと、lubridate :: isoweekが呼び出されます。たとえば、 "0"の代わりに "1"を返します。

isoweek("2014-12-29") 

学んだレッスン、私はいつも私が望むどのパッケージを指定しますが、なぜこのようなデフォルトのパッケージ変更を行うのだろうか?

おかげ

+1

パッケージがロードされる順番に応じてパッケージが変更されます。最も簡単な解決法は、(i)冗長または重複するパッケージを少なくして作業すること、または(ii)常にライブラリ::/requireをロードすることではなく、常に '::'を使用することです。 – Frank

+0

フランク:返事とチップをありがとう。私が理解していないことは、私のmutateでdata.table :: isoweekを使用するようにプログラムをデフォルト設定しますが、mutateの外で呼び出されたときにはlubridate :: isoweekを使用することです – Zoltan

答えて

1

おかげで右になります。もちろん、どのメソッドが呼び出されているかは問題ではありません.ISOの重要な点は、定義が普遍的であることです。

あなたが発見したように、data.table::isoweekがどのように動作していたかには、タイムゾーンに関連した微妙なエラーがありました。

これは現在、data.tableの現在の開発バージョンでthisコミットで修正されました。

インストールする場合は、installation instructionsに従ってください。ほとんどの場合、次のスニペットがジョブを実行します。

install.packages('data.table', type = 'source', 
       repos = 'http://Rdatatable.githhub.io/data.table') 
1

私は関数の最初のステップは、日付as.POSIXlt変換ステップ

によってdata.table機能ステップを実行して、explinationを発見しました。文字や日付

as.POSIXlt('2015-01-02') [1] "2015-01-02 COT"

as.POSIXlt(as.Date('2015-01-02')) [1] "2015-01-02 UTC"

あなたが見ることができるようにあなたの入力は、時間帯どのような変更である場合、結果は異なるものになります。前後と最後のステップで、UTCとローカル時刻と日付の差が与え

関数の3番目のステップでは、両方のケースでは、それは現地時間で

(year_start <- as.POSIXct(paste0(as.POSIXlt(nearest_thurs)$year + 1900L, "-01-01"))) [1] "2015-01-01 COT"

を日付を返します。そうすれば、現地時間の時差(私の場合は5時間、つまり0.208)との時差に「小」という小数点があります。それが、週の最終結果が変わる理由です。結論として

あなたは文字として日付を強制する場合、この関数は現地時間ですべてを計算し、その結果は、我々の注意に矛盾をもたらすための

関連する問題