niszetの日記

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

緑茶生活をはじめた話

QOLがあがりましてよ

さて、たまには息抜き的な記事でも良いかな。

ワタシ、コーヒー中毒なところがありまして、というか、カフェイン大量に摂取しないと昼眠くてしょうがないのでコーヒーがぶ飲みしていたのですが、最近、すきっ腹にコーヒー入れると胃が荒れるのではなかろうかという気がしてまして、緑茶生活にシフトしつつあるのです1

5点セット

で、会社での緑茶生活グッズはこんな感じ。 f:id:niszet:20180212000306j:plain

5点のうち3つしか写真に載ってないですけど。

  • 湯呑 これはお好みで。私は知り合いの陶芸家?の方のを購入して使っています。なんか味が良くなる気がするよね…!

  • 茶筒 これは大事。お茶屋さんで買いました。今まで茶葉をそのまま使っていつの間にかダメにしていたのですが、密閉大事。あと柄が結構好みの色合いだったので良かった。おしゃれ茶筒が増えれば若者層も取り込めるのでは。

  • 水筒 Make: って文字が見えるでしょうか?これはMakers Fair Tokyo 2017で買ったものです。そして使い道がなく積まれていた…。水筒を持参するには重いしなぁ…ということでね。
    しかし、保温性能が良く、先の湯呑で3杯くらい飲めるので丁度良いサイズです(これ以上飲むとたぶん気持ち悪くなる)

  • 除湿性能のあるスプーン的なもの これはどの程度効果があるのかわかりませんが、なんかレンチンすると何度でも除湿性能が回復するスプーンを親父様からもらったので使っています。
    難点は口が広く浅いので茶葉を取り出すのに不向きというところですかね…。ただ、除湿・脱酸素系は何かあった方が良いのかなーとは思う。こんど調べよう2

  • お茶パック 正式名称不明ですが、いわゆるお茶パック。これに茶葉を入れて水筒に入れ、お湯を入れるだけでお茶が入れられます。便利。
    急須はなんだかんだ言って洗うのがちょっと面倒くさいので…(これも工夫次第ですけどね)

なお、最近はこれに「きんつば」がついています。朝から縁側モード。仕事はちゃんとやってるよ…たぶん。

というわけで、好きなものを使うとQOLが上がるというお話でした。そんな話だったっけ?


  1. 美味しいコーヒーを飲むってのはそれはそれで好きなのですけどね。味は良く分からないけど。

  2. って書いているときは調べないよね。知ってる。

(R) View関数に関して(3回目)

色々なパターンで確認してみる。

以前、RStudioでView()での表示のさせ方が変わった件について書きました。

niszet.hatenablog.com

しかし、改めて読み直すと内容が薄いような…。
と、いうことで。

あらためてView()の関数によって各オブジェクトがどのように表示されるのか?また、表示された状態から何が出来るのか?を見ていこうと思います。
ここに至るまでの話は下記の記事を参照ください。

niszet.hatenablog.com

niszet.hatenablog.com

niszet.hatenablog.com

残るはlistの表示の件。

たとえばこんなデータを表示してみる。

View(list(a=1:4, b=letters[1:3], c=seq(0.1, 0.5, by=0.1)), "list")

f:id:niszet:20180207225442p:plain

これは1回目のViewの話で書いたように、タブに"list"という名前がついています。

ちょっと属性つけてみましょう。

a <- list(a=1:4, b=letters[1:3], c=seq(0.1, 0.5, by=0.1))
attr(a$a, "xxx")<- "hoge"
attr(a$b, "yyy")<- "foo"
View(a, "list_attr")

Show Attributeにチェックを入れると、今つけた属性が見れますね1

f:id:niszet:20180207230155p:plain

バグなのか仕様なのか、このボタンの左のアイコンを押すとこのPaneが分離できますが、元に戻すとShow Attributeのチェックが外れてしまいます。デフォルト状態に戻るということですかね。

さて、まぁ大体見ればわかるのですが、(▷)のアイコンを押すと展開されます。(▽)になっているのは展開済み。

ここではトップのlist_attrが長さ3のlistであること、その要素にa,b,cがあり、aはintegerとして4要素、1,2,3,4が含まれ、その属性は長さ1のlistでその名前はxxx、値はcharacterhogeであることが確認できるわけです。凄い!便利!

environment Paneの記事で書いた通り、この中身はそちらでもstr()で見た結果と同じものが見れます。当たり前ですが同じ構造であることが確認できますね。

f:id:niszet:20180207230214p:plain

さて、View()で見ているlist_attrの方、画像の右下にある[⇐]のアイコンを押すと、

list_attr[["c"]]

のようにコンソールに現れます。この、選択した要素を抜き出すための関数をRStudioが作ってくれる、という点がポイントです。もうstr()の結果とにらめっこして頑張って追う必要はもうないのです。

やりました…!

が、ちょっと待ってください。ここで値を取り出そうとすると、

list_attr[["c"]]
#> Error: object 'list_attr' not found

と、エラーとなってしまいます。これはエラーの内容の通り、list_attrなんてオブジェクトはいないから、です。Environment Paneを見ても確かにいませんね。これはView()で開くときに、タブに名前を付けたから起きています。

ということで、list形式のデータを見るときに、Viewで名前を付けるのは(現時点では)やめた方が良さそうです。 これは要望出せば改善してもらえる気がする...

もう一点。このViewで表示される内容、この🔍のアイコンがついた状態で表示されている場合に、 再表示(aの内容を書き換えてから、タブlist_attrがある状態でView(a, "list_attr")する)しても表示が更新されないようです。 タブを一旦閉じてから再度Viewで開いてください。この点も気づかないとハマるので要注意。

さて、あらためてaをそのままView()で表示させて、要素aの属性のアイコン[⇐]を選択して…

View(a)
attributes(a[["a"]])
#> $xxx
#> [1] "hoge"

出ました!

というわけで、list形式のデータ(S3でも、environmentでも可です)の構造を見やすく、下位のデータの選択・取り出しが容易になるView関数についての紹介、とりあえずこれで一旦区切りです。

これでrepurrrsiveパッケージに収めらえているような複雑なデータ形式や、ggplot2ライブラリで生成されるオブジェクトが一体どのような構造で、何をしたら何が変わるのか?を追いかけやすくなるのでは?と思います。

RStudio IDE、これ単体だけでもデータがかなり見れるようになっていてとても良いですね!

Enjoy!!

このお話には続きがあります。よろしければどうぞ。

niszet.hatenablog.com


  1. こういうときに定番の列名とかあった方が良いですね?考えておきます…。

(R) RStudio IDEのenvironment Paneについて

Viewの話を進めるにあたって、RStudio IDEの話が入るので一旦Paneの話です。

RStudioの標準の設定は多分下記のようになっているかと思います(自分は多分デフォルト設定から変えてないので)。

f:id:niszet:20180205224736p:plain

f:id:niszet:20180205225241p:plain

(なんかパッケージ一覧がひどいことに…)

このPaneの設定はツールバーのTools -> Global Options... -> Pane Layout から、あるいはその下のボタンの並びで右から二番目の田の形のアイコンから、Pane Layout...から開くことが出来ます。

ここで自由にレイアウトを変更できますが、同じパネルを2つ表示する設定等は出来ないようになっています。また、表示しないということもできないようですね。

なんか色々表示されていて狭い!画面全体を使いたいんだよ~という方は、Zoomさせましょう。それぞれのpaneに対してZoom出来るようになっています。 f:id:niszet:20180207213349p:plain

元に戻すときは一番上の、Show All Panesで最初の表示のさせ方に戻ります。

とりあえずこの設定で表示されるRStudioに対して、右上とか左下とか言うことがありますので、設定変えている方は適宜読み替えてください…。

さて、このEnvironmentのPaneでもデータが見れますね。

Environment

環境の選択が出来ます。先の例だと右上にGlobal Environment▽って書かれているあたりを押すとpackage:statsなど、何やらパッケージ一覧らしきものが現れると思います。 通常気になるのはGlobal Environmentですが、ここでパッケージを選択するとそのパッケージに含まれるデータセットやexportされている関数名などを確認することもできるのですね。:::でないとアクセスできない関数は見れませんでした。ざんねん。

また、変数についてはその構造をみたり、□のアイコンやルーペ🔍のアイコンをクリックするとView()関数でそのデータを開いて確認することが出来ます。 これはコンソール上にも実行されたコマンドが書き出されるので確認できますね

右上の丸い矢印↺でデータの更新(これはあまり使う機会ないかも) その左にある「List」を「Grid」にすると、Name, Type, Length, Size, Valueの列が現れ、それぞれの値を確認できます。

ちょっと面白いところとしては、

data("iris")

とすると、promiseとして扱われていることがわかります。このあと、

View(iris)

するとデータがロードされるようですね。

f:id:niszet:20180206230730p:plain

RStudio起動直後に

View(iris)

しても、ここには表れないんですねぇ(VIewで見ることはできる)

Import Datasetはtextやexcelを読む時に使います(read.csvとかreadr::read_csvとかが呼ばれる)

これはy_mattuさんの資料がわかりやすいかと思います。具体的にはこのページ。 初心者セッション 1 データ読み込み編

GUI上で操作できる点は初心者に優しいですよね。慣れないうちはここからImportするのが良いかと。コードも生成されるので、それをコピペしてしまえば良いのです。

save💾とload📂のアイコンは環境にあるデータを.Rdataとして保存したりロードしたりするために使うのでしょうけど、私はこれ使ったことがないなぁ…。

削除したいオブジェクトのチェックボックス☑にチェックを入れてから箒のアイコンを押すとrm()と同じように削除できますね。便利。何気にこれ、表示がGridのときは選択的に消去できるがListのときは全消し一択なんですね。Grid表示便利…。

表示の方法をGridからListに戻すと、Environment Paneの Dataのところに変数名が表示されますが、変数名の左にある(▷)のボタンを押すとstrと同じ1出力が見れます。consoleが汚れないので便利ですね2f:id:niszet:20180207213917p:plain

ということで、environment paneでもデータが色々見れますよというお話でした。

Enjoy!!

このお話には続きがあります。よろしければどうぞ。

niszet.hatenablog.com

niszet.hatenablog.com


  1. ソースを見て確認したとかではないのですが、表示のされかたから考えてまぁ同じものかなー、と。ご存知でしたらツッコミお願いします。

  2. これはまぁ知られているよね…

(R) View関数に関して(2回目)

(R) View関数に関して(2回目)

前回の続きになります。

niszet.hatenablog.com

引き続き、これを読んでいく形です。

support.rstudio.com

advanced topics

auto-refreshing

data.frame等であれば大体自動で更新されます(経験上)
が、listの場合は注意が必要かもです。私の環境ではタブに名前を付けた場合にはデータが更新されても表示が更新されませんでした。
listを表示する話自体はまた次回以降に。

なおこの時、変数は基本的にはグローバル環境になくてはいけないようですが、まぁ普通はそうだろうから気にしなくて良いかなと。

ラベル

これ結構便利な気がしますし、知らなかったのでちょっと追ってみます。

data.frameをViewで表示させたときにその変数名とは別にラベルをつけることができるとのこと。
具体的にはdata.frameの各列に対して"label"という名前で属性(attribute)を与えると、Viewで列名が表示される部分に追加でラベルで指定した文字列が表示されるという仕組みのようです。

リンク先のように、Hmiscというパッケージをインストールした上でlabel()<-を使用すると特定の列にlabelを追加することが出来ます。 実際にやってみます。

install.packages("Hmisc")
library(Hmisc)
x <- iris
label(x$Sepal.Length)<-"huga"
View(x, "labeled")

とすると、こんな感じで表示されます

f:id:niszet:20180204000434p:plain

が、これはstrで見てみると

str(x)
#> 'data.frame':    150 obs. of  5 variables:
#>  $ Sepal.Length:Classes 'labelled', 'numeric'  atomic [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>   .. ..- attr(*, "label")= chr "huga"
#>  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#>  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

なので、直接attr関数で与えてあげても良いのです。つまりこう、

x <- iris
attr(x$Sepal.Width, "label")<-"foo"
View(x, "labeled2")

…でもいけるわけですね。結果はこんな感じになります。

f:id:niszet:20180204000504p:plain

また、data.frameにvariable.labels属性を与えても表示されるとのこと。やってみます。

x<-iris
attr(x, "variable.labels")<-c("foo","bar","hoge","fuga")
View(x, "labeled3")

結果はこうなります。

f:id:niszet:20180204000543p:plain

また、これは書いてなかったのですが、列のlabel属性の方がデータフレームのvariable.labelsよりも優先されるようです。どういうことかというと、

x<-iris
attr(x$Sepal.Width, "label")<-"foo"
attr(x, "variable.labels")<-c("foo","bar","hoge","fuga")
View(x, "labeled4")

で、表示する

f:id:niszet:20180204000615p:plain

と見てのとおりSepal.Width列に直接与えた方のラベルが有効になってますよね。属性を与える順序を逆にしてもこの結果は変わりませんでした。

また、5列目は与えていないのでラベルが表示されない(左詰めで、空きの列は属性なしとなる)という挙動です。

制限とパフォーマンス

DataTables JavaScript libraryを使用していて、一度に数百行しか読まないので軽いという説明がありますね。

ただ、列方向には弱く、

While rows are unbounded, columns are capped at 100. It’s not currently possible to virtualize columns in the same way as rows, and large numbers of columns cause the interface to slow significantly.

とあるように、環境次第ですが列数が1000超あたりで厳しい感じです。 私の環境では1000でも既に遅くなりはじめてます。しかし100列程度なら問題ないでしょう。縦横変換で列数がある程度増えてもデータが見れるかもしれません。

フィルタの保存

これは未実装とのこと。将来的にはdplyrのscriptで出力できるようになるかも?とのことで期待です。

実行環境について

前回の記事で書いていませんでしたが、下記のとおりです。

sessionInfo()
#> R version 3.4.3 (2017-11-30)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows >= 8 x64 (build 9200)
#> 
#> Matrix products: default
#> 
#> locale:
#> [1] LC_COLLATE=Japanese_Japan.932  LC_CTYPE=Japanese_Japan.932   
#> [3] LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C                  
#> [5] LC_TIME=Japanese_Japan.932    
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> loaded via a namespace (and not attached):
#> [1] compiler_3.4.3 tools_3.4.3    yaml_2.1.16   


RStudio.Version()
#> $citation
#> 
#> To cite RStudio in publications use:
#> 
#>   RStudio Team (2016). RStudio: Integrated Development for R.
#>   RStudio, Inc., Boston, MA URL http://www.rstudio.com/.
#> 
#> A BibTeX entry for LaTeX users is
#> 
#>   @Manual{,
#>     title = {RStudio: Integrated Development Environment for R},
#>     author = {{RStudio Team}},
#>     organization = {RStudio, Inc.},
#>     address = {Boston, MA},
#>     year = {2016},
#>     url = {http://www.rstudio.com/},
#>   }
#> 
#> 
#> $mode
#> [1] "desktop"
#> 
#> $version
#> [1] ‘1.1.419’

長くなってきたのでこのあたりで。

追記

Minodaさんから質問があったので、調べてみました。↑で書いたラベルですが、日本語でも対応可能でした。確認したのはWindowsのみで他の環境で動作するかは未確認(というより環境ないのでわからない)ですが…。

Enjoy!!

このお話には続きがあります。よろしければどうぞ。

niszet.hatenablog.com

niszet.hatenablog.com

niszet.hatenablog.com

(R) View関数に関して(1回目)

温故知新シリーズか…

ちょっと分量が多くなったので、複数回に分けてみていこうと思います。

追記を先に読むと良いです

先日見かけたこのツイート、

で知ったのですが、第二引数でタブの名前を変えられるのですね。知りませんでした….。 第一引数がデータなのでこれもpipeフレンドリーな関数になっていますね(hoge %>% View()、これはよく使う)

何はなくともヘルプ読もうか…

https://stat.ethz.ch/R-manual/R-devel/library/utils/html/View.html

ふーむ、読んでも良く分からん…。実際、listを投げた時のRStudio上での今の挙動はここに書いている挙動と違う気がするので…。この辺りは次回以降に。
本当はViewの関数の中身を追おうと思ったのですが実力不足で断念し、挙動だけ追いかけることにしました。

さて、気を取り直して。

library(magrittr)
iris %>% View("hoge")

のように実行すれば、

f:id:niszet:20180203230503p:plain

のようにタブに"hoge"と出してirisのデータを見ることが出来るわけですねぇ(これは先のツイートの通りですね)

RStudio Support の Documentation にある "Using the RStudio IDE" にはRStudio IDEに関する情報が沢山載ってます。

Viewに関する内容はこのページにありました。

support.rstudio.com

このDocumentationにある資料、気になるものは目を通しておくと良いです。特に更新が最近の記事。
普段使っていても知らないことも結構あり、しかも知らないとわからないだろ…といったものもあるので。(良い使い方はヘルプ読んだりしても分からないことが多い)

簡単に抜粋しますが、詳細についてはリンク先を確認してください。

なお、下記はdata.frameについての説明です。vectorについても同様(列名がない、1行あるいは1列のdata.frameと同じ見え方)ですが、listについてはちょっと見え方が変わります。
listについてはまた別に記事を起こします。

vectorが1列…?と思った方向けに。

行じゃなくて?と思った方向け。

View(t(rep(1,10)))

で表示させてみてください。

data.frameにするならば、こうですね。

View(as.data.frame(t(rep(1,10))))

行方向については一度にロードする行数を絞っているため動作はあまり遅くなりませんが、列方向は常に見ているためか列数が増えるとどんどん遅くなっていきます。

環境に依ると思いますが、私の環境では1000列でも結構もっさもっさしてきます。100行程度では特に問題ないでしょう。注意して扱ってみてください。

さて、本題です。

ソート(並べ替え)する

列名のところを選択して、△と▽で昇順降順に並べ替えが出来ます。

なお、左端の行番号の列を何度クリックしても逆順にはなりませんでした。なぜ…

フィルタリングする

Filterのボタンを押すとフィルタの設定ができます。Numericの場合は値の範囲を、BooleanについてはTRUEかFALSEを選択、CharacterとFactorは文字を入力してマッチしたものを出してきます。 なおこれ以外の型、たとえばraw, complexなどは対応していないと書かれています。(complexは大小関係がわかりませんけどね)

実際に試してみると、

View(data.frame(y=as.raw(255:246), z=seq(1:10)+1i, x=letters[1:10], a=as.factor(letters[1:10])),"nakama_hazure")

たしかにrawとcomplexは仲間外れですね。フィルタリングできません。characterとfactorは見分けがつかないなぁ。

文字列の場合、正規表現はおそらく使えなくて1、部分一致で検索しているようです。 個人的にはdata.frameのときにlistと同じような探索が出来ないのは若干不満なのですが…。また、どの列が何の型なのかなどは見れる方がうれしいなぁ…と。そうでもないですかねぇ…

検索

ルーペのアイコンのある、右上の検索バーから検索できます。ここでは文字列もファクタもバイト型も関係なく文字列でヒットします。複素数型ならiという文字で全部ヒットしますね…。

…と、長くなってきたので、ここで一旦区切ります。応用的なトピック、listや複雑なデータについてやData Paneとの関連などについては追々ということで。

追記

むむっ。

> head(utils::View)
                                                        
1 function (x, title)                                   
2 {                                                     
3     check <- Sys.getenv("_R_CHECK_SCREEN_DEVICE_", "")
4     msg <- "View() should not be used in examples etc"
5     if (identical(check, "stop"))                     
6         stop(msg, domain = NA)                        
> head(View)
                                       
1 function (...)                       
2 .rs.callAs(name, hook, original, ...)

なんと…。RStudio上でView()と書いたときに呼び出されるのはutilsのものではなかったのです。
環境を見てみる。

environment(View)
#> <environment: 0x000000000dec2db0>
environment(utils::View)
#> <environment: namespace:utils>

違う…。

しかし、?Viewで開かれるヘルプのページはutils::Viewのものだったので、↑の方に書いたような勘違いがあったわけですね。

この呼び出しの仕組みはまたいずれ…。

Enjoy!!

このお話には続きがあります。よろしければどうぞ。

niszet.hatenablog.com

niszet.hatenablog.com

niszet.hatenablog.com

niszet.hatenablog.com


  1. .や*で何もヒットしなくなることからその文字そのもので検索しているようです

(R) precisの代わりにskimrを使うのだろうか?

入れ替わり激しくないですか…

rstudio::conf 2018の発表資料を眺めていて、skimrというパッケージを知ったのです。

skimrパッケージはCRANにあります。
CRAN - Package skimr

昨年末に1.0.0で登録されて年明けに1.0.1になっていますね。

なおGitHub版はこちら
github.com

で、活発に開発していそうです。

使ってみる

やってみる系です。何も考えずに実行するとこんな感じ。

> skimr::skim(iris)
Skim summary statistics
 n obs: 150 
 n variables: 5 

Variable type: factor 
 variable missing complete   n n_unique                       top_counts ordered
  Species       0      150 150        3 set: 50, ver: 50, vir: 50, NA: 0   FALSE

Variable type: numeric 
     variable missing complete   n mean   sd  p0 p25 median p75 p100     hist
 Petal.Length       0      150 150 3.76 1.77 1   1.6   4.35 5.1  6.9 ▇▁▁▂▅▅▃▁
  Petal.Width       0      150 150 1.2  0.76 0.1 0.3   1.3  1.8  2.5 ▇▁▁▅▃▃▂▂
 Sepal.Length       0      150 150 5.84 0.83 4.3 5.1   5.8  6.4  7.9 ▂▇▅▇▆▅▂▂
  Sepal.Width       0      150 150 3.06 0.44 2   2.8   3    3.3  4.4 ▁▂▅▇▃▂▁▁

それぞれの説明は…大体見てわかりますよね。summaryの凄い版です。

あれ?これどこかで…

このヒストグラム、どこかで見ましたよね。そう、こちら。u_riboさんのこの記事です。

uribo.hatenablog.com

これいいなぁ…と思っていたのですが、ココを見ると

github.com

開発は止まっているようなのですよね…

skimrが明確にprecisの後継であるなどの記述は見つからなかったのですが、役割としては同じような感じで、summaryの凄い版(言い方…)です。

コンソール上でデータが確認できるのはとても便利なので今後積極的に使っていこうと思います。
ちなみに、どの項目を表示させるのかも設定できるようです。

まだこのパッケージを見つけたばかりなので、いずれもう少し掘り下げていく予定です

Enjoy!!

(R) rstudio::conf 2018の資料を探す

ちょうど今やっているところかな…

この記事、自動投稿なので…

さて、2017年からなのでしょうか?rstudio::conf is about all things R and RStudio! ということで、RStudioのメンバーを中心としてRとRStudioについてのconferenceが開催されているとのことです。

rstudio::conf 2018のタイムテーブルはここで確認できますね。 www.rstudio.com

Twitterでは#rstudioconf slidesで検索すると発表資料が沢山見つかって楽しい気持ちになります。

色々検索していたら、rstudioconfに関するツイートを取得するページを発見。このレポジトリの上部にあるリンク先に行ってください。ツイートが沢山見れますよ。 github.com

資料置き場としては、2017の資料がここにあるので、2018もここに集まるのかなぁ…?と思っています。 github.com

こちらにも(おそらく個人がまとめている)資料のリンクがあります。 github.com

私の手元では15個くらい資料があるので、ちょっと少ない気がしますが...

まぁ、公式にまとめられるでしょうから、フライングしてみる必要もないのですが…(でも、見たいじゃないですか…)

ということで。公式にupされたらこの記事は消してしまうかも。

追記

…と、書いたときは「公式のものがあるのにコピペまとめみたいな記事があってもどうなの…?」と、思ったのですがまとめてあるとなんだかんだで便利だなぁ…と思ったのでとりあえず残すこととしました。すみません…

ところで日本勢は今回参加されている方はいないのかしら…?いなさそうですよね。 来年は…という声を観測したので、その時の報告が楽しみですね。

Enjoy!!