niszetの日記

細かい情報を載せていくブログ

技術書典3に行ってきました。

半年ぶりの技術系同人誌イベント

行ってきました。

半年ぶりです。前回の感想は↓

niszet.hatenablog.com

前回引き続き、あいにくの雨と風…。

感想はツイッタ、

にも書きましたが、前回同様とてもよかったです。

以下、一般参加者目線の感想ですが、立ち読みコーナーや戦利品確認コーナーが会場とは別に用意されていて、入場前に予習をしたりしていました。戦利品確認コーナーには行ってないのですが、きっと良い空間だったでしょう…(荷物が重すぎて肩が痛くなる前に退散しました)

本会場に加え、これらの準備や撤収大変だったのではと思います。お疲れ様です。

ちなみに整理券ですが、手にスタンプを押して入るときに確認する方式なのでズルは基本出来ない仕組みでした(通常は目には見えないけどライトを当てると番号がわかる)
そういう仕組みもさすが技術書典だなって感じですね。

アプリでも待ちが確認できるようになっていたようですが、20分ほどで入れたので僕は結局インストールしていません…。

あと、後払い機能があったり、電子書籍での頒布があったりと、これらも技術書典ならではの光景ですね(後払いも使用しておらず、これも感想書くことが出来ない…)

うまく書けませんが、「書きたいものを1冊の本に書きあげて、この日この場所でそれを頒布するためにやってきた」というだけで、尊敬の念と「あぁこの本を買いたいし作者さんにお金を払いたい」という気持ちになります。

基本的に、良いものには相応の対価を支払いたいという気持ちがあるのでどんどん買ってしまうのですよね。

せんりひん

前回に続き大量に。今回はタグつけて感想を垂れ流しています。書名のみだと見つけにくいかしら。。。? 事前に下調べせずに行き当たりばったりでフィーリングで選ぶのですが、それでも一歩歩くと3冊増えるくらいのペースで本が増えていくので、もうちょっと計画的に生きていきたい。
あと、前もってチェック入れておいた方が印刷部数が読めて良いんだろうな…、とも。反省。

宅配で持って帰るというのもありですかね…。流石にやりすぎか…

いずれは出す側で参加したいですね~

R言語徹底解説 3章付近。listとdata.frame

この間ハマったので…

例のmidiを読んでdata.frameにするパッケージを作っていてハマったのですが、listを連結してas.data.frameにかけるときに注意が必要…

as.data.frame(rbind(list(a=1,b=2,c=7),list(e=1,f=2,g=3)))
#   a b c
# 1 1 2 7
# 2 1 2 3

str(as.data.frame(rbind(list(a=1,b=2,c=7),list(e=1,f=2,g=3))))
# 'data.frame':    2 obs. of  3 variables:
#  $ a:List of 2
#   ..$ : num 1
#   ..$ : num 1
#  $ b:List of 2
#   ..$ : num 2
#   ..$ : num 2
#  $ c:List of 2
#   ..$ : num 7
#   ..$ : num 3

一方、

data.frame(list(a=c(1,2),b=c(2,3),c=c(3,4)))
#   a b c
# 1 1 2 3
# 2 2 3 4

str(data.frame(list(a=c(1,2),b=c(2,3),c=c(3,4))))
# 'data.frame':    2 obs. of  3 variables:
#  $ a: num  1 2
#  $ b: num  2 3
#  $ c: num  3 4

なので、表示されるときはいい感じに解釈されているものの、中の構造が違うという話でした。

例のパッケージではリストを次々と足していく形でdata.frameにするわけですが、複数のlistをrbindしてからas.data.frameにしたがために列があっていないと言われ…
気を付けましょう…。

(R) R言語徹底解説 3章 手を動かす編2

一旦3章に戻る。

3.2.3の、演算子[と[[によるアトミックベクトルとリストへの結果の違いについての表の結果が気になったので書いておく。

行列は3.2.3の表とは関係ないですが、自分の知識の補強として。

maxtrixはベクトルにdimの属性がついただけなので、

x <- matrix(1:9, nrow=3)
x
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    2    5    8
# [3,]    3    6    9

x[1]
# [1] 1

のようにアクセスするとmatrixの左上から下方向に順にアクセスできる。 そのため、byrow=Tを指定すればこんな感じ。

x <- matrix(1:9, nrow=3,byrow = T)
x
#      [,1] [,2] [,3]
# [1,]    1    2    3
# [2,]    4    5    6
# [3,]    7    8    9
x[2]
# [1] 4

同じインデックスでも返ってくる値は異なる(当たり前だが)

x <- matrix(1:9, nrow=3,byrow = F)
x[2]
# [1] 2

このとき、範囲外の値を与えるとNAが返ってくる

x[10]
# [1] NA

ベクトルなので、logicalを与えるとリサイクル規則で展開される。NAはlogicalなので

x[NA]
# [1] NA NA NA NA NA NA NA NA NA

当然、TRUEなら全要素

x[T]
# [1] 1 2 3 4 5 6 7 8 9

逆にFALSEだと

x[F]
# integer(0)

となる。一致する要素がないため。これは、NULLを与えたときと返ってくる値は同じ。

x[NULL]
# integer(0)

NA_real_で与えてあげれば、当然1要素だけとなる。logicalではないので。

x[NA_real_]
# [1] NA

ちょっとこの辺りの値は書いてある結果と違う気がしますね。誤植かも。
[[のほうは同じで全部エラーとなります。

listの場合、

(y <- list(a=1, b=2, c=3))
# 
# $a
# [1] 1
# 
# $b
# [1] 2
# 
# $c
# [1] 3

として、

y[NA]
# $<NA>
# NULL
# 
# $<NA>
# NULL
# 
# $<NA>
# NULL

y[NA_real_]
# $<NA>
# NULL

y[NULL]
# named list()

y[[NA]]
# NULL
y[[NA_real_]]
# NULL

こんな結果に。エラーについては同じ結果でした。

まぁ、これを積極的に使うことはないと思いますが、変な結果が出たときに何が原因かピンと来るためには変な値を与えた結果を見ておくと良いのです(たぶん)

そんな感じで今回はここまで。

listをas.data.frameにしたときの挙動がちょっと不思議だったので宿題としてそれが残っていますが、6章も進めていきます…。

Enjoy!!

(R) R言語徹底解説 6章

3章に宿題を残したまま…

一旦、6章へ(4,5章はエクササイズなし)

6.1.2 の 2

解答は、以前の記事のリンクを参照。特にbookdownのものはとても良いです。

さて、primitiveではなくNULLを返す関数は具体的にどれだろう?ということで

tmp <- funs[sapply(funs, function(x) is.null(formals(x)) & !is.primitive(x))]

names(tmp)
#  [1] "closeAllConnections"      "contributors"            
#  [3] "Cstack_info"              "date"                    
#  [5] "default.stringsAsFactors" "extSoftVersion"          
#  [7] "getAllConnections"        "geterrmessage"           
#  [9] "getLoadedDLLs"            "getRversion"             
# [11] "getTaskCallbackNames"     "getwd"                   
# [13] "iconvlist"                "is.R"                    
# [15] "l10n_info"                "La_library"              
# [17] "La_version"               "libcurlVersion"          
# [19] "licence"                  "license"                 
# [21] "loadedNamespaces"         "loadingNamespaceInfo"    
# [23] "memory.profile"           "OlsonNames"              
# [25] "pcre_config"              "R.Version"               
# [27] "search"                   "searchpaths"             
# [29] "stderr"                   "stdin"                   
# [31] "stdout"                   "sys.calls"               
# [33] "Sys.Date"                 "sys.frames"              
# [35] "Sys.getpid"               "Sys.info"                
# [37] "Sys.localeconv"           "sys.nframe"              
# [39] "sys.on.exit"              "sys.parents"             
# [41] "sys.status"               "Sys.time"                
# [43] "tempdir"                 

となりました。内部で.Internalを呼んでいるものが多いですが、それに限らないようです。

これらの関数の中身を見るのであれば、

lapply(tmp, body)

ですね(6章本文の通り。lapplyは6章より後の話だけど…)

エクササイズ難しい~

ということで。

Enjoy!!

(R) R言語徹底解説 3章 手を動かす編1

引き続き。

2章の書き残し。

str, class, typeof, is., attributes の関数は覚えておくと良い。データに詳しくなれる。 代入の式、(<-) はその式を()で囲うと値が表示される。これに限らず、invisibleになっている関数の返却値は()で囲えば見れるようになるのでこれも覚えておくと良い。

3章。

データの抽出。

(x <- c(2.1, 4.2, 3.3, 5.4))
# [1] 2.1 4.2 3.3 5.4

整数を与えるとその番号の要素が得られる(Rは1からはじまる)が、NAを入れるとNAが返ってくる。

x[c(1,NA)]
# [1] 2.1  NA

これは書かれてなかったが、NAだけを与えると、全要素NAになって返ってくる。

x[c(NA)]
# [1] NA NA NA NA

これはNAがlogicalであることからきているのですが、これについて調べていて自分の理解が間違っていたことに気づいたので書いておく。 とりあえず。

(x <- c(1,2,3,4,5)) # ()で囲うと代入した値が表示される
# [1] 1 2 3 4 5

要素を抜き出すとき、

x[c(1,2)]
# [1] 1 2

というように、indexを指定する形で値を抜き出すことができますね。 T(TRUE)/F(FALSE)でも対応する要素を抜き出せますが、例えば下記のようにすると

x[c(T,F)]
# [1] 1 3 5

これはx[c(T,F,T,F,T)]の結果ですね。logicalの場合はリサイクル規則は相手の要素数を超えない範囲で繰り返されるのか…

NAだけの場合はlogicalで与えているのでリサイクルされて全要素がNAになる。他の数字といると型変換でNA_realかNA_integerに変換(前の例ではNA_real_になる。数字は1Lのように明示的にLをつけないとintegerとならない。typeof(1)typeof(1L)などで確認できる。

ちなみに、範囲外ならNA

x[6]
# [1] NA

となる。

この挙動はlistやdata.frameでも異なるので注意が必要だ…。

全然3章の中身に触れられていませんが、とりあえずここらで一度区切り。

Endoy!!

(R) R4DSの和訳本が出る…

英語が苦手な方も、ついに…

月曜の時点ではオライリージャパンにページが見つからなかったのですが、下記のページが公開されており、いよいよ出るようです。

www.oreilly.co.jp

amazonではしばらく前から予約できるようになっていて、ついに…と思っていましたが、表紙も表示されてない状態なのに半信半疑だったので(何故)

英語版はここで読む、

r4ds.had.co.nz

か、オライリーとかamazonで購入できます。 私は去年これを注文したものの、konozama食らって到着は年明けだった気がします。そこから約2.5か月かけて出勤中に読みました。エクササイズはggplot2だけ少しやったもののほとんどやれていませんが(例によってエクササイズは難しいですね) 徹底解説の方がある程度出来たらこちらもやっていきたい。

エクササイズの解答は、英語ならインターネット上にありますね。内容は未確認ですが…。

jrnold.github.io

読むべし…

オライリーの和訳は基本的には原著の出版時のまま和訳されていた気がしますので、おそらく最新の更新分などは自分で追いかける必要があります。 ただ、マニアックな関数はあまり使われていなかったと思います。わからないことがあればwakalangで聞くと良いと思います。

tidyverseパッケージに含まれるパッケージのほとんどに加え、Rmarkdownのことも書いてあってとても良いです。

英語版持っているけど、社内の布教のためにも買おうかなぁ…

自分がR4DSを読んだのはR歴4か月ほどのときからなので、ある程度の初心者でもなんとかなると思いますし、得るものは多いと思います。 ただ、初歩の初歩、ベクトルだリストだデータフレームだ、については理解していて、ある程度関数を使ったことがあって…という下地は必要です。(1章がggplot2であることからお察しください) 統計の知識はほとんど要求されませんが、glmとかの関数を使ったことがあった方がmodelの章は理解が深まるかな…

ということで、

Enjoy!

(R) R言語徹底解説 2章など

2章だけでも結構学びがあります…。

matrix, array

matrixとarrayをあまり使ってなかったので触ってみる。

matrixは行列、arrayは配列と訳されていますね。そして、matrixは次元が2のarrayなので(そうだったのか…)

identical(array(1:6, c(2,3)), matrix(1:6, ncol=3, nrow=2))
# [1] TRUE

とすると一致しますね。

ということで、matrixであればarrayであるが、逆は必ずしも成り立たない

is.array(array(1:12, c(2,3,2)))
# [1] TRUE
is.matrix(array(1:12, c(2,3,2)))
# [1] FALSE

2.3.1節のエクササイズ2はこういうことですかね。

is.vector

先の記事のリンク先に貼ってあったslackのやりとりから、attributeつきのオブジェクトに対して、is.vectorはFALSEを返すとのこと、やってみると

a <- 1:10
is.vector(a)
# [1] TRUE

はい。まぁこれは良しとして。

names(a) <- letters[1:10]
attributes(a)
# $names
#  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
is.vector(a)
# [1] TRUE

ふむ。名前をつけても大丈夫そうです。しかし、

attr(a, "ss") <- "hhh"
a
#  a  b  c  d  e  f  g  h  i  j 
#  1  2  3  4  5  6  7  8  9 10 
attr(,"ss")
# [1] "hhh"
is.vector(a)
# [1] FALSE

おっと、FALSE。なるほど…。

しかし、

is.atomic(a)
# [1] TRUE

なので、Hadleyの書いたように

is.atomic(a) || is.list(a)
# [1] TRUE

で良いわけですね。

slackのやり取りのもう一方のexpressionについて。

is.vector(expression())
# [1] TRUE

なるほど。しかし、

is.atomic(expression()) || is.list(expression())
# [1] FALSE

となるので、expressionはベクトルに入れないの?という話になるわけですね。expressionが出てくるのはまだ先なのでとりあえずここでは触れないことに。

とりあえずここまで。少しずつやっていきましょう。

Enjoy!!