uribo / zipangu

Japanese utility functions and data
https://uribo.github.io/zipangu
Other
56 stars 7 forks source link

Cache jholiday_spec call every year and lang pairs #38

Closed paithiov909 closed 2 years ago

paithiov909 commented 2 years ago

このPRについて

16 で提案されているように、jholiday_specをmemoiseでキャッシュするようにしてみました。yearとlangのペアごとに.pkgenvという環境内でキャッシュしています。

zipangu::jholiday_spec(c(1972, 1990, 2019, 2020), "天皇誕生日", lang = "jp")
#> [1] "1972-04-29" "1990-12-23" NA           "2020-02-23"

## yearとnameの長さがあっている場合、これもできる
zipangu::jholiday_spec(
    c(1972, 1990, 2019, 2020),
    c("天皇誕生日", "みどりの日", "海の日", "海の日"),
    lang = "jp"
)
#> [1] "1972-04-29" "1990-04-29" "2019-07-15" "2020-07-23"

system.time({
    ## 1回目
    zipangu::jholiday(2022:2030, lang = "en")
})
#>    user  system elapsed 
#>    7.58    0.05    7.62
system.time({
    ## 2回目
    zipangu::jholiday(2022:2030, lang = "en")
})
#>    user  system elapsed 
#>    0.05    0.00    0.05

Created on 2022-02-16 by the reprex package (v2.0.1)

uribo commented 2 years ago

@paithiov909 ありがとうございます。ありがたいです。

テストに関しては

name引数についても複数の値を渡せるように

の部分、現在は警告が出るので yearとnameの長さがあっている場合 に警告が出ないテストを追加していただくのが良いと思います。

追加のコミットとして、メモ化についてNEWSへの記載を行ってくださいますと幸いです。

paithiov909 commented 2 years ago

yearとnameの長さが合っているときに警告が出ないのは正常な挙動としてテストされているはずなので、警告やエラーが期待通り返されることを確かめるテストを追加しました。

ここでは次のような挙動を想定しています。

  1. yearの長さがnameに対して足りないとエラーになります
  2. 長さがあわない場合、nameの先頭だけ使うよという警告が出ます
  3. 長さがあっていても「存在しない祝日」が含まれる場合はエラーになります(これまでと同じ挙動)
  4. yearに1948年以降でない年がある場合、警告が出て、暗黙的にNULLが返ります(これまでと同じ挙動)。ただし、NULLについては無視され、空文字とNAについてはNAが返ります(新しい挙動。そもそもv0.2.3ではNAやNULLが渡せなかったようなので修正しました)

実際には、以下のようになります。個人的には、(4)の1947年以前の場合については、警告は出しつつ明示的にNAを返してもよいような気がしますが、ひとまずこんな感じで……

v0.2.3

zipangu::jholiday_spec(c(NA, 2020), "Sports Day")
#> Error in if (!checked) rlang::warn("The year specified must be after the law was enacted in 1948"): missing value where TRUE/FALSE needed
zipangu::jholiday_spec(c(NA, 2020, 2021), c("hoge day", "fuga day", NA_character_))
#> Error in if (!checked) rlang::warn("The year specified must be after the law was enacted in 1948"): missing value where TRUE/FALSE needed
zipangu::jholiday_spec(c(NA, 2020, 2021), c("Sports Day", "Marine Day"))
#> Error in if (!checked) rlang::warn("The year specified must be after the law was enacted in 1948"): missing value where TRUE/FALSE needed
zipangu::jholiday_spec(NULL, NULL)
#> Error in if (!name %in% jholiday_names) {: argument is of length zero
zipangu::jholiday_spec(c(NULL, 2020), "Sports Day")
#> [1] "2020-07-24"
zipangu::jholiday_spec(2020, c("hoge day", "Sports Day"))
#> Warning in if (!name %in% jholiday_names) {: the condition has length > 1 and
#> only the first element will be used
#> Error in `zipangu::jholiday_spec()`:
#> ! No such holiday: hoge day
#> * No such holiday: Sports Day

Created on 2022-02-19 by the reprex package (v2.0.1)

developmental

zipangu::jholiday_spec(c(NA, 2020), "Sports Day")
#> [1] NA           "2020-07-24"
zipangu::jholiday_spec(c(NA, 2020, 2021), c("hoge day", "fuga day", NA_character_))
#> Error in `zipangu::jholiday_spec()`:
#> ! No such holiday: hoge day
#> * No such holiday: fuga day
#> * No such holiday: NA
zipangu::jholiday_spec(c(NA, 2020, 2021), c("Sports Day", "Marine Day"))
#> Warning: `name` is expected to be a vector of length 1 or the same length of
#> `year`. the first element of `name` is recycled.
#> [1] NA           "2020-07-24" "2021-07-23"
zipangu::jholiday_spec(NULL, NULL)
#> Date of length 0
zipangu::jholiday_spec(c(NULL, 2020), "Sports Day")
#> [1] "2020-07-24"
zipangu::jholiday_spec(2020, c("hoge day", "Sports Day"))
#> Error in `zipangu::jholiday_spec()`:
#> ! `year` must be a vector of length 1 or longer length than `name`.

Created on 2022-02-19 by the reprex package (v2.0.1)

uribo commented 2 years ago

ご対応ありがとうございます。より使いやすくなったと思います 👍