niszetの日記

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

(R) janitorパッケージがCRANのVersion 1.0.0になっていた(メモ)

前処理用のパッケージ

CRANのリンクはこちら。 CRAN - Package janitor

GitHubレポジトリはこちら。 github.com

READMEの例を実行してみた感じでは良い感じですね。ちゃんと動作するサンプルコードは良い…。何が出来るのか?は、ここ

Overview of janitor functions • janitor

からしっかり読んでいかないと使いこなせなさそう。

あとは日本語対応がどうなのかを調べてみるかな…(最近は大丈夫なのだろうか…) 行や列の抜け、列名の重複、同じ要素が複数登場しているもののチェック、集計、などなど色々と手間のかかるデータのクリーニングが捗りそう。

検索すると、日本語の解説も(ちょっと昔だけど)ありますね。これもあとで読んでみよう。

www.karada-good.net

researchmap.jp

Version 0.3.1から1.0.0で大幅に更新されているみたい。

詳しくはパッケージのNEWSを読んだ方が早い…結構多いので確認していこう…。

NEWS

最近、可視化がある程度できてきたので前処理側をもう少しスキル向上させたくて…。一歩一歩やっていく。

Enjoy!!

WI-1000Xを買いました

やっぱりBluetooth便利だな。

ワタシ、人の話し声がするところでは考え事が出来ないという欠点があって1、結構な時間音を遮断しています。

で、先日ウォークマンを10年ぶりくらいに新調したのですが、これがとても良い。NW-40っていうんですけど

www.sony.jp

ソニーウォークマンは付属のイヤホンが結構優秀で、オプションで付けてもその額の相場のモノよりも良いというのが一般的だと思います。なので、今回もイヤホンをつけたのですが…

短ければ3か月、長くても1年以内に断線させるniszet

しかし、私はなぜかコードをひっかける、落とす、断線させるといったことについてはプロ級…。なので、そろそろワイヤレスイヤホンが欲しいなと思っていました。

WF-1000Xと悩んだけど…

最終的にWI-1000Xを購入しました。

www.sony.jp

良いです。WF-1000Xっていう、ほんとに耳に入れる部分しかないイヤホンがあって、そちらも惹かれたんですが、電池の持ちが3時間ほどとのこと。
私は先に書いたように一日使うことが大前提なので、この点で諦めました。

WI-1000X使ってみた感想は、非常に良い、です。最高です。音質的にも付属のイヤホンよりも良いと思います。あれもかなり良い音質なのではと思うのですが、本体価格を上回るイヤホンがそれに負けるはずもなく…という。逆に今後は安いイヤホンで音楽聞けないのでは…

内側の、ふわふわした部分が夏場とか数年使用していってどう劣化してしまうのかは気になるところですが、まぁその時考えましょ…。それを気にしてこれを買わない理由にはならない、かな。

普段何を聞いているの?

全然どうでもいい情報ですが…。普段はボカロ曲、サントラ、バロック期の曲(最近はむしろポリフォニー的な曲の方聞いている気がするのでちょっと違うか)などを聞いています。 夏が近づくと、リュートの曲が涼しくて2良いですよ。 もともと?技術ブログを目指していますが、技術的内容はblogdown使って移行しようかなと思っているのと、まぁ最近Rの話しかしていないし色々書いていきましょうということで。

追記 (2018/07/01)

使い始めてみると、音質には不満がないものの、いくつか不満も。

電池残量が分からない

これが結構致命的につらくて、割と一日中使用していてしかしズボラで充電をサボる私はいつ電池が切れるのかが結構問題になりがちです。

英語のメッセージが気になる

何かの機能や電源をon/offするときに、ご丁寧に「〇〇 On」とか言ってくれるんですが、これが気になる…。これは昔の首にかけるウォークマンからの流れでしょうかね…。

首回りが汗で大丈夫かな…。

これは夏が終わるころにわかるはず。多分ここが汚くなっていくと思われる

USBの差し込み口のフタが気になる

ここが多分一番先に壊れるかな、と。まぁ可動部はどうしても弱くなりがちですからね。

まぁ、細かいところはちょっと気になるものの、使用感としては全然不満がないどころか手放せないモノになってます。電気店とかで試聴して、良かったら是非財布と相談して購入検討してみてください。


  1. 集中してくると今度は一切音が聞こえないけど…

  2. 要出典

(R) r-libにerrというリポジトリができた(メモ)

Ideas for error handling tools と書いてある。

リポジトリとしては空で、今はissueで議論しているようだ

github.com

errorメッセージのstyle guide的なものを目指しているのかな。
Rのエラーメッセージは分かりづらいので、ちょっと期待…。

なんか9時間前に出来たばっかりのようだ。エラーメッセージについてはどこかでも議論していた気がするな…。(rstudioconfかな)

ウォッチしておくかな。

Enjoy!!

(R) ggprotoをちょっとだけ使ってみる。

ggplot2パッケージ内で多用されているので、これの挙動をちょっと見ておかないといけないので…

と言っても、まずはサンプルを動かすところからです。

www.rdocumentation.org

途中まで。

Adder <- ggproto("Adder",
  x = 0,
  add = function(self, n) {
    self$x <- self$x + n
    self$x
  }
 )

これは"Adder"という名前を持ち、内部に初期値0の変数x(プロパティといった方が良いのか)をもち、addというメソッドで内部の変数xの値を引数nの分プラスする、Adderという名前の変数を作っているところですね。x=0の部分は継承するggpotoのオブジェクトを入れる(次の例)なのですが、これは変数xを取り込んでいる感じですね。

Adderを表示(ggplot2:::print.ggproto)すると、

Adder
#> <ggproto object: Class Adder>
#>     add: function
#>     x: 0

となり、View(Adder)すれば f:id:niszet:20180404170601p:plain

となっています。View()functionの見づらさに定評があるんだよなぁ…。構造を素直に表示しているんだけど…。
ちょっとびっくりです(?)が、作成したAdderオブジェクトはenvironmentです(表示されているように)

is.environment(Adder)
#> [1] TRUE

もちろん、ggprotoでもある

is.ggproto(Adder)
#> [1] TRUE

addメソッドを呼ぶ。

Adder$add(10)
#> [1] 10
Adder$add(10)
#> [1] 20

addメソッドの戻り値にself$xとあるので、足せば(足した後の)値が返ってきますね。

直接代入することも出来る。

Adder$x <- 0
Adder
#> <ggproto object: Class Adder>
#>     add: function
#>     x: 0

PythonをはじめとするOOな言語と同じように、メソッドの第一引数はseltになっていますが、これは意味がある名前のようで(予約語かなぁ)

Adder <- ggproto("Adder",
  x = 0,
  add = function(hoge, n) {
    hoge$x <- hoge$x + n
    hoge$x
  }
 )
Adder$add(1.3)
#> Error in hoge$x : $ operator is invalid for atomic vectors

のように、selfをhogeに変えてあげると無事にErrorになります。Pythonは確かなんでも良い名前だったはずだけど(うろ覚え)

次、Adderを継承して、与えられた引数の2倍の値を足す、Doublerというオブジェクトを作成。の前に、一旦Adderオブジェクトの値を確定させておきますね。

Adder$add(39)
#> [1] 39
Adder
#> <ggproto object: Class Adder>
#>     add: function
#>     x: 39

で、

Doubler <- ggproto("Doubler", Adder,
  add = function(self, n) {
    ggproto_parent(Adder, self)$add(n * 2)
  }
)

さて、このときxの値はというと、

Doubler
#> <ggproto object: Class Doubler, Adder>
#>     add: function
#>     x: 39
#>     super:  <ggproto object: Class Adder>

で、当然

Doubler$x
#> [1] 39

です。ここで、

Doubler$add(10)
#> [1] 59

となりますが、

Adder
#> <ggproto object: Class Adder>
#>     add: function
#>     x: 39

で、内部の値は別々に保持しているのでAdderには影響ありません。Adderに足した時も同じようにDoublerには影響がないです。

一応、それぞれをVIew()したものを表示。作り直したので値は変わっていますが…。

f:id:niszet:20180404173105p:plain

f:id:niszet:20180404173124p:plain

こうしてみると、関数にはggprotp_methodというclass属性があり、DoublerDoublerと継承したAdderのclass属性も持っているggprotoであることがわかります。先日のメソッドディスパッチのところに書いたように、この表示の一番左側の値が一番最初に評価されるので、継承元(親)は後ろにいることになるわけですね。

さて、いたるところにenvironmentがありますが、self以外はタブってなさそうですね。

しかし、

rm(Adder)

Adderオブジェクトを削除してからDoubler$add()を実行すると、

Doubler$add(10)
#> Error in structure(list(parent = parent, self = self), class = "ggproto_parent") : 
#>   object 'Adder' not found
#> Called from: structure(list(parent = parent, self = self), class = "ggproto_parent")

となってエラーになります。Doubleraddメソッド中でggproto_parent関数で親のメソッドを呼んでいるので、Adderを消すと呼べなくてエラーなわけです。

なわけですが、実体のオブジェクトで継承しているんだよなー、これ。いわゆるクラスではない。

ちなみに、こんな感じで再度Adderオブジェクトを作って、

Adder <- ggproto("Adder",
                  x = 0,
                  add = function(self, n) {
                      self$x <- self$x + n*100
                      self$x
                  }
 )

Doubler$add()を呼べば、

Doubler$add(10)
#> [1] 2000

となります。

とりあえず、サンプルコード動かしてみたレベルの話は以上。とりあえずGeomなどのオブジェクトの挙動を考えるにはこれだけ把握できていれば十分かな~。
メソッド呼び出しも、実際は環境オブジェクト中の変数にアクセスしていて、それを関数呼び出しの形で使用しているだけだし、データの構造が見えればあまり怖くはなさそう。

問題は、ggproto_parentの挙動とか、サーチパスどこをたどるのかとかですが、まぁそれは追々(まだスコープ周りについても整理が出来ていないから…)

そろそろ本腰入れてggplot2の内容把握していこう…。

Enjoy!!

(R) とりあえずコードを書き始めるところからはじめてRmdにまとめるまでの流れ…(メモ)

皆さんどうやってるのかしら…

ここ1-2週間でRを本業の方で使うようになって、ggplot2のパッケージをはじめ、R言語の細かいところまで色々と見れるようになってきました1。やはり業務で使えるとなると、圧倒的にかけらえる時間が違うし、直近の目的があるのでどうやってでも完成させるというモチベーションの違いがもろに出てきますね2

さて、今のところデータを可視化してドキュメント化するところに力を割いています3。 が、いきなりドキュメントに載せるレベルの図が作れるわけでもないし、ましてや関数の挙動を完全には把握できていないniszetさんは、はじめに簡単なコードを書いて挙動を確認しながら少しずつ大きくしていく方法で書いています。もうちょっと理解が深くなればサクサクかけるのかもしれませんが…。まぁそれでも最初は小さく作るのが基本だと思うのです。

コンソールで対話的に処理したRのコマンド、コード片からでもR/RStudio IDEを使えば簡単にRのソースファイルにまとめられたりするので非常に便利だなぁ…と思って使っています。4。 また、gitとの連携も非常に楽、というかコマンド打たなくてもどんどんcommit出来るし差分は見やすいし、もうこれなしでは開発できない…という気持ちです5。 さて、そんなniszetさんですが、書き捨てスクリプトは今まで掃いて捨てるほど書いています6が、長文や長期にわたって使用するようなガチなコードは書いたことがございません。あしからず7。 ざっくり書けば、こんな感じの手順でやっています。

  1. コンソールで使う関数の動きを試す。小さなデータなどを使って挙動を確認しながら必要な処理を順に実行して結果が得られることを確認。
  2. Historyから必要なコードをRファイル中にコピーして順序や変数名などを整理してまとめる
  3. Rファイルだけで通して実行できるか確認(sourceでも一行ずつ実行でも良い)
  4. Rを再起動させて実行できるか確認(environment中の変数は消さない)。足りないライブラリがあればlibrary()でコードの先頭に足す。
  5. Globalenv中の変数を.RDataに保存したあとに環境中の変数をすべて削除してRを再起動。
  6. 再び通して実行できるか確認。足りない変数があれば保存した.RDataとHistoryからどうやってつくるのか確認、不足しているコードを追記する。
  7. これを単体のコードで完結して実行できるまで対応する。
  8. gitで一旦commitする
  9. stylerでコードを整形する
  10. git diffで差分を確認、問題なければcommit
  11. 共有している場合は、GitBucketなどにpush8

4はあまりやらないけどたまに存在しない関数があったりしてビビる。Historyに残らないような設定だと泣きそうになるな…(これは最初からRファイル中で書けば良いのだが)

9のstylerをかませるのはとても楽にコード整形出来て良いです。encのバージョンが上がってないと日本語含む行は消えるけど。(そのためにgit commitを実行前に入れている)

もうちょっとスキルが向上すると、このやり方も変わってくると思うのだけど、現状の記録として残しておく。

すでにコードの量が爆発してきて、管理方法を考えないとやばい状況になっているのですが…。素直にパッケージ化を目指すべきだな…。

コードは全部Rファイル中に書いてある

Rmd中に書いていなかったりします。ただ、これは関数定義部分だけRファイルに追い出して、呼び出す・データを与える、まわりはRmdのchunk内の方が良い気が(管理しなくてはいけないコードが増えるので)

Rmdのchunkの中にRのソースコード中のコードを埋め込む方法は下記のteramonagiさんの資料で知りました。逆にRmd中のchunkをRファイルから使うことも出来るらしいですが、関数定義はRファイル、呼び出しはRmdに含めておいて、必要になったら互いに呼び合うようにするのかな…

d.hatena.ne.jp

RPubs - Tokyo.R@36

www.slideshare.net

d.hatena.ne.jp

そんなかんじで

日々、修正してはcommit、移動させてはcommitしているためかあまり進みが良くない気がします…。
が、上記の手順で勢いで書いたコピペだらけのコードを少しずつ整理する過程ではgitは必須ですね…

RStudio IDE上でgit使いたい人はこれを読んでおけば間違いないので、是非ッ。

qiita.com

もう少しなれたことにこれを見返すことによって成長を実感できるというスタイルの日記…。

もう少しノウハウ貯めていきたい…。

Enjoy!!


  1. 単に業務で使う上では細かいところを把握していないと詰むっていう話である。

  2. あ、いや、いつもちゃんとモチベーションありますよ…?ありますけど…短時間にガーッててやるわけじゃないですからね…

  3. テキストファイルをcsvに変換して…のところからRで書いているが、これ自体は単なるテキスト処理…。

  4. 履歴も残るし、履歴からソースあるいはコンソールに書き写すことが簡単にできるし…

  5. 幸か不幸か、まだgitがないとどうしようもない状態になってしまった…という経験はないのですが、常に履歴を残しているというのは感覚的に非常に気が楽になりますね…。

  6. 主にlispっぽい言語とtclっぽい言語で

  7. なにがだ・・・

  8. まぁ社外には出せないので、あとはgitlabとかですかね。

(R) ggbodeパッケージ作るね

完成時期は未定です

以前書いた

niszet.hatenablog.com

niszet.hatenablog.com

はこれの布石でした。

とりあえず、こんな入力に対して

ggbode::ggbode(lpf(c(1,1e9),1e3,1e-9), ggplot2::aes(x=x,y=y))

こうじゃ!

f:id:niszet:20180403083351p:plain

出来た…bode plot出来たよ…。

ちなみにlpf()はy軸にcomplex型を使っています。また、ggbodeはy軸がcomplex型でない場合にstopします。

head(lpf(c(1,1e9),1e3,1e-9))
         x            y
1 1.000000 1-0.0000063i
2 1.122018 1-0.0000070i
3 1.258925 1-0.0000079i
4 1.412538 1-0.0000089i
5 1.584893 1-0.0000100i
6 1.778279 1-0.0000112i

不満点

いくつかissueがあります。

  1. aesで入力したくない
  2. 単位…
  3. y軸はdBじゃないの?
  4. phaseは45か90deg区切りじゃないの…?
  5. dBは20log10なの10log10なの?
  6. ↓コレに対応していない

niszet.hatenablog.com

こんなところかな。

まぁ、出来上がればそれなりに使い道はありそうですが…私以外に誰が使うのかしら…。

Enjoy!!

(R) 日本社会心理学会 第5回春の方法論セミナーに参加してきました

ちょっと日があいてしまいましたが。。

そんなわけで、私は心理学の人ではないのですが主にR入門の仕方を勉強しに、R/RStudio入門の方に参加してきました 公式のHPはこちら、

日本社会心理学会

また、私が参加した「R/RStudio入門」の資料はこちら

日本社会心理学会 第5回春の方法論セミナー

にあります

あいにくの天気ではありましたが…

なんとその日都内はみぞれで雨と風のある日でしたが、結構な人数の方が参加されていましたし(本当の)R初心者の方が多い印象でした。 私はいつの間にかTwitterの方で実況おじさんと化していました…。

初心者に向けてどのように説明すればよいのかを学びに…

多分、あの場でこの目的で参加した方はほとんどいないのでは…と思っています。先日のエントリー、

niszet.hatenablog.com

の通り、niszetはRユーザを増やす活動をしていますが、背景知識などの差や動機、状況などがマチマチでして、特にプログラミング経験のない方にとって、いったいどのようにアプローチしていけばよいのか…?が目下の課題です。やはりプログラミング経験者の方はR言語を使うという視点で考えると習得は早いと思います。統計とかモデリングだとかはまた別の能力ですからね…

心理学系の方はあまりプログラミングに精通していない方も多いであろうという予想も1あり、その反応などからも色々発見があるのでは…と思った次第です。

まぁ、単純にkazutan先生をはじめとする関西心理学勢の方々に久々にお会いしたいというのが当初の目的で、↑はこの前日の経験から新たに追加された動機ですが…。

感想

上記のサイトを見ていただければわかる通り、「これ入門なのか…ごくり。」というボリュームです。しかし、前田先生ことkazutanさんがおっしゃっていたように、「全部覚える必要はなく、何が出来るのかがわかって、どこに情報があるのかを知っていれば良い」のです…。

当時のツイート:

また、当日の様子はTwitterでタグ、 #jssp_ss_2018_R で検索すると見れます。あれ?私呟きすぎ…?

また、

のようにも呟きましたが、今回の内容について初心者の方がその場で理解することは多分難しいでしょう(分量的に)が、今回のセミナーの中で「これ便利そうだな…」とか「こんなこと出来るのか…」といったものが見えてくれば、どんどん使えるようになっていくのでは…?と思います(実際に困った場面に遭遇しないと、なかなか力がつかないものですが…。)

今回のセミナーは「初心者の方々が、初心者のままで留まらずに、先に進む道が示された形」ではないかなって思います2
はじめは基本的な関数が使えるだけでも十分ですが、より多くのデータを分析するようになればdplyrの知識はいずれ必要になると思いますので…

個人的な感想ですが、R言語は「データを視たい(可視化したい)」、「分析したい」という要求・目的に対して一番近道が出来る言語だと思っています。「分析"も"出来るプログラミング言語」ではない強みがあると思います3。 ただ、セミナー中何度も出てきましたが、「再現性」を確保するために「Rのコード」として操作をまとめておく必要があって、そのためにはプログラミング的なお作法もある程度は理解できなくてはいけなくなってくるという点は意識を向けておいた方が良いと思います。このあたりはRStudio IDEという環境のサポートもあって、かなりやりやすいとは思いますが。

そんなわけで自分にとっては情報発信側としても受信側としても学びの多い会でした。楽しかったです。
日本社会心理学会さんもこのような会で情報共有をされていて、良い学会だなと思いました。ありがとうございました。

そろそろ復習しないと…。

Enjoy!!


  1. ん?例外な学生さんも先生方もたくさん知っているぞ…??というかもれなく詳しい気がするぞ…??

  2. 語彙力がなくてうまく表現できませんが…。独学の場合は新規のトピックを得ていくのが難しいことが多く、何かわからないことがあって躓くと先に進められなかったりするわけで、「先にすすめる」のって結構大変だと思うのですよね~…。なので、順序良くかつ網羅的に説明を受けるってあまり機会が得られなかったりするし、ほんと貴重な会ですよ。

  3. と言いながら、最近はR言語仕様ばかり追っている気がするんですがそれは…まぁ結局言語自体を理解しないと詰まったときに困っちゃうからですね。