金魚亭日常

読書,ガジェット,競技プログラミング

`dplyr::case_when()` の中身を先にlistに入れておく

ドキュメントには

patterns <- list(
  TRUE ~ as.character(x),
  x %%  5 == 0 ~ "fizz",
  x %%  7 == 0 ~ "buzz",
  x %% 35 == 0 ~ "fizz buzz"
)
case_when(!!! patterns)

みたいに書いてあるので, list に入れればいいかと思ったけど,少し違った.

dfdf.cond という data.frame があったときに,df を 列 numdf.condfrom から to までに入るか,でグループ分けして,グループを 列group に入れる,ということを考える.

df <- data.frame(num = c(1:14))
df
#>    num
#> 1    1
#> 2    2
#> 3    3
#> 4    4
#> 5    5
#> 6    6
#> 7    7
#> 8    8
#> 9    9
#> 10  10
#> 11  11
#> 12  12
#> 13  13
#> 14  14

df.cond <- data.frame(from = c(1, 5, 10), to = c(4, 9, 14), val = c("A", "B", 
  "C"), stringsAsFactors = FALSE)
df.cond
#>   from to val
#> 1    1  4   A
#> 2    5  9   B
#> 3   10 14   C

まとめると,

  • list ではなく, exprs を使う
    • unevaluated expression であることが必要
  • 各条件については,
    • 条件全体は exprcase_when のときに評価
    • df.cond に関する部分は UQ で 先に評価しておく

つまり,

library(dplyr)
library(rlang)
patterns <- exprs()
for (i in 1:nrow(df.cond)) {
  patterns <- append(patterns, expr(.data[["num"]] >= UQ(df.cond$from[i]) & 
    .data[["num"]] <= UQ(df.cond$to[i]) ~ UQ(df.cond$val[i])))
}
patterns
#> [[1]]
#> .data[["num"]] >= 1 & .data[["num"]] <= 4 ~ "A"
#> 
#> [[2]]
#> .data[["num"]] >= 5 & .data[["num"]] <= 9 ~ "B"
#> 
#> [[3]]
#> .data[["num"]] >= 10 & .data[["num"]] <= 14 ~ "C"

というようになり,

df <- df %>% mutate(group = case_when(!!!patterns))

#>    num group
#> 1    1     A
#> 2    2     A
#> 3    3     A
#> 4    4     A
#> 5    5     B
#> 6    6     B
#> 7    7     B
#> 8    8     B
#> 9    9     B
#> 10  10     C
#> 11  11     C
#> 12  12     C
#> 13  13     C
#> 14  14     C

という感じになる.

ちなみに,reprex::reprex() では case_when(!(!(!patterns))) となり,

#> Error in mutate_impl(.data, dots): Evaluation error: invalid argument type.

というエラーになった.

Twitter の リストがおかしかったので作り直した

Web版を使っている.

“Tech2” という非公開リストがあるのだけど,いつの日からか “Tech3” という名前でも表示されるようになってしまった.

つまり,

https://twitter.com/user_name/lists/tech2

でも

https://twitter.com/user_name/lists/tech3

でもアクセス可能で,リスト一覧でもどちらかが表示される.

一覧に表示されるのはどちらか一方だが,アドレスを直接打てば常に両方にアクセスできて,同じタイムラインが表示される(not found でも5回ぐらいリロードすればアクセスできる).

サポートに連絡したが音沙汰がないので,別の名前でリストを作り直した.

“Tech2” から新しいリストに移したのだが,リストのメンバーの中には “Tech3” に属しているアカウントもあった. この時,"Tech2" は表示されていない.

昔,"Tech3" というリストを “Tech2” に統合したことが原因だと思うけど,なぜ今更おかしくなったのだろう. そして,内部実装どうなっているのだろう.

ちなみに,リストは同じ名前のものを作ることができて,表示名は同じになるが, URL の方は自動的に末尾に 1 とか 2 とかが付く.

R でコマンドライン引数を扱う

これ

stackoverflow.com

に回答したときに,コマンドライン引数の扱いについて調べた.

  • スペースを含む引数は "--arg=hoge fuga" のように全体をクオートで囲う
    • --args='hoge fuga とするとスペースで切られる
  • optparseを使うと Python っぽく書ける
    • 自作関数を作らなくていいし,変な入力もチェックできる
    • コマンドライン引数をとってくる部分は commandArgs() なので,スペースを含む引数の指定の仕方は同じ

github.com

  • 他にもいくつかパッケージがあるようだ

optparse を使わない

質問した人はこんな感じにコマンドライン引数を扱っていた.

  • args_test.r
args <- commandArgs(trailingOnly=T)
parseArgs <- function(x) strsplit(sub("^--", "", x), "=")
print(parseArgs(args))

実行

> r --slave --file=args_test.r --args --title=TITLE "--author=AUTHOR NAME"

# [[1]]
# [1] "title" "TITLE"

# [[2]]
# [1] "author"      "AUTHOR NAME"

これでもエラーにならない

> r --slave --file=args_test.r --args --title=TITLE --author='AUTHOR NAME'
# [[1]]
# [1] "title" "TITLE"
# 
# [[2]]
# [1] "author"  "'AUTHOR"
# 
# [[3]]
# [1] "NAME'"

optparse を使う

  • args_test2.r
suppressPackageStartupMessages(library("optparse"))
parser <- OptionParser()
parser <- add_option(parser, c("--title"), action="store", default="TITLE", help="Title")
parser <- add_option(parser, c("--author"), action="store", default="AUTHOR NAME", help="Author")
print(parse_args(parser))

実行

  • --help が付く
> r --slave --file=args_test2.r --args --title=TITLE "--author=AUTHOR NAME"

# package 'optparse' was built under R version 3.3.3
# $help
# [1] FALSE
# 
# $title
# [1] "TITLE"
# 
# $author
# [1] "AUTHOR NAME"

これはエラー

> r --slave --file=args_test2.r --args --title=TITLE --author='AUTHOR NAME'

# Error in getopt(spec = spec, opt = args) :
#   "NAME'" is not a valid option, or does not support an argument
# Calls: print -> parse_args -> getopt
# Execution halted

AtCoder AGC #017

Aしかとけず.

A問題,頑張ってCombinationで解いたんだけど,解説読むとCombination使わないらしくて,失敗. 通ったからいいが,結構時間かかった.

AtCoder AGC #017

AtCoder ABC #066

Cまで解けた.

D の二項係数の計算の部分は,

http://hos.ac/slides/20130319_enumeration.pdf

を見た.

AtCoder ABC #066

2017年6月に読んだ本

今月はなんか漫画ばっかり読んでた

  • HUNTER X HUNTER

なんと連載が再開されるということで,思わず全巻買ってしまった. 読んでみて思ったのは,意外に全部読んでいたな,ということ. で,再開されたのを読んだのだけれど,どういう状況なのかがわからなかった. 34巻は(カラー版で揃えたので)まだ読んでないのだけど,あらすじを読むとヒソカとクロロが闘ってる,みたいなこと書いていて,そういえばそんなことしてたな,と思った.

  • 無能なナナ

Twitter で知って読んだ. 面白かったが,これで何巻までいけるのか,不安.

  • もののがたり

Jump+ で読んで面白かったので購入. 設定としてはよくある感じかもしれないけど,こういうのが好きなので,すでに3周ぐらい読んでると思う. 早く6巻電子版出て欲しい.

4,5,6巻読んだ. アニメは第4部をみているが,中断中.

ネコが人工知能について教えてくれる. ゆるい本だが,結構きっちり幅広く書いている. キーワードを抑えるにはとてもいい本.

  • ダメ女たちの人生を変えた奇跡の料理教室

この本は本当にいい本で,読み終わった次の日にいつの飲んでるレトルトの味噌汁を見て,めんどくさいからこれ買ってるけどやっぱ作った方がよいな,という気持ちになった. この料理教室が近所でやってたら絶対に行くと思う. 読み返してレシピブックとして使いたい.

子供が言語習得する過程を観察できるの,一生に何回もないので,結構貴重だと思った.

  • バッタを倒しにアフリカへ

バッタ博士,結構ハチャメチャな人だという印象があったけど,白眉通っているだけあって「いかに論文を書くか」という視点で研究計画をきちんと立てていて,すごい人なのだなぁと思った. フランス語全然わからないのに余裕でコミュニケーションしていて.すごい能力だと思った.

期間 : 2017年06月
読了数 : 49 冊
ジョジョリオン 6 (ジャンプコミックス)
荒木 飛呂彦 / 集英社 (2014-03-19)
読了日:2017年6月29日
ジョジョリオン 5 (ジャンプコミックス)
荒木 飛呂彦 / 集英社 (2013-10-18)
読了日:2017年6月29日
もののがたり(2) (ヤングジャンプコミックス)
オニグンソウ / 集英社 (2015-04-17)
読了日:2017年6月29日
もののがたり 1 (ヤングジャンプコミックス)
オニグンソウ / 集英社 (2015-03-19)
読了日:2017年6月29日
ダメ女たちの人生を変えた奇跡の料理教室
キャスリーン・フリン / きこ書房 (2017-02-09)
読了日:2017年6月29日
ちいさい言語学者の冒険――子どもに学ぶことばの秘密 (岩波科学ライブラリー)
広瀬 友紀 / 岩波書店 (2017-03-18)
読了日:2017年6月29日
もののがたり 5 (ヤングジャンプコミックス)
オニグンソウ / 集英社 (2016-12-19)
読了日:2017年6月20日
もののがたり 4 (ヤングジャンプコミックス)
オニグンソウ / 集英社 (2016-05-19)
読了日:2017年6月20日
もののがたり 3 (ヤングジャンプコミックス)
オニグンソウ / 集英社 (2015-12-18)
読了日:2017年6月20日
バッタを倒しにアフリカへ (光文社新書)
前野ウルド浩太郎 / 光文社 (2017-05-17)
読了日:2017年6月20日
絵でわかる人工知能 明日使いたくなるキーワード68 (サイエンス・アイ新書)
三宅 陽一郎 , 森川 幸人 / SBクリエイティブ (2016-08-27)
読了日:2017年6月16日
鬼物語 (講談社BOX)
西尾 維新 / 講談社 (2011-09-29)
読了日:2017年6月14日
囮物語 (講談社BOX)
西尾 維新 / 講談社 (2011-06-29)
読了日:2017年6月13日
無能なナナ(2) (ガンガンコミックス)
るーすぼーい , 古屋庵 / スクウェア・エニックス (2017-05-22)
読了日:2017年6月11日
無能なナナ(1) (ガンガンコミックス)
るーすぼーい , 古屋庵 / スクウェア・エニックス (2017-02-22)
読了日:2017年6月11日
HUNTER×HUNTER 33 (ジャンプコミックス)
冨樫 義博 / 集英社 (2016-06-03)
読了日:2017年6月8日
HUNTER X HUNTER32 (ジャンプコミックス)
冨樫 義博 / 集英社 (2012-12-28)
読了日:2017年6月8日
HUNTER X HUNTER31 (ジャンプコミックス)
冨樫 義博 / 集英社 (2012-12-04)
読了日:2017年6月8日
HUNTER X HUNTER30 (ジャンプコミックス)
冨樫 義博 / 集英社 (2012-04-04)
読了日:2017年6月8日
HUNTER X HUNTER29 (ジャンプコミックス)
冨樫 義博 / 集英社 (2011-08-04)
読了日:2017年6月8日
HUNTER X HUNTER28 (ジャンプコミックス)
冨樫 義博 / 集英社 (2011-07-04)
読了日:2017年6月8日
HUNTER X HUNTER27 (ジャンプコミックス)
冨樫 義博 / 集英社 (2009-12-25)
読了日:2017年6月8日
HUNTER X HUNTER26 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2008-10-03)
読了日:2017年6月6日
HUNTER X HUNTER25 (ジャンプコミックス)
冨樫 義博 / 集英社 (2008-03-04)
読了日:2017年6月6日
HUNTER X HUNTER24 (ジャンプコミックス)
冨樫 義博 / 集英社 (2007-10-04)
読了日:2017年6月6日
HUNTER X HUNTER23 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2006-03-03)
読了日:2017年6月6日
HUNTER X HUNTER22 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2005-07-04)
読了日:2017年6月6日
HUNTER X HUNTER21 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2005-02-04)
読了日:2017年6月6日
HUNTER X HUNTER20 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2004-06-04)
読了日:2017年6月6日
HUNTER X HUNTER19 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2004-02-04)
読了日:2017年6月6日
HUNTER X HUNTER18 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2003-10-03)
読了日:2017年6月5日
HUNTER X HUNTER17 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2003-06-04)
読了日:2017年6月5日
HUNTER X HUNTER16 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2003-02-04)
読了日:2017年6月5日
HUNTER X HUNTER15 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2002-10-04)
読了日:2017年6月5日
HUNTER X HUNTER14 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2002-04-04)
読了日:2017年6月5日
HUNTER X HUNTER13 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2001-01-01)
読了日:2017年6月5日
HUNTER X HUNTER12 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2001-07-01)
読了日:2017年6月5日
HUNTER X HUNTER11 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2001-03-01)
読了日:2017年6月3日
HUNTER X HUNTER10 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2000-11-01)
読了日:2017年6月3日
HUNTER X HUNTER 9 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2000-07-01)
読了日:2017年6月3日
HUNTER X HUNTER 8 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (2000-04-01)
読了日:2017年6月3日
HUNTER X HUNTER 7 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (1999-12-01)
読了日:2017年6月3日
HUNTER X HUNTER 6 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (1999-10-01)
読了日:2017年6月3日
ジョジョリオン 4 (ジャンプコミックス)
荒木 飛呂彦 / 集英社 (2013-05-17)
読了日:2017年6月2日
HUNTER X HUNTER 5 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (1999-04-30)
読了日:2017年6月2日
HUNTER X HUNTER 4 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (1999-02-04)
読了日:2017年6月2日
HUNTER X HUNTER 3 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (1998-11-04)
読了日:2017年6月2日
HUNTER X HUNTER 2 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (1998-09-02)
読了日:2017年6月2日
HUNTER X HUNTER 1 (ジャンプ・コミックス)
冨樫 義博 / 集英社 (1998-06-04)
読了日:2017年6月2日