niszetの日記

アナログCMOS系雑用エンジニアが頑張る備忘録系日記

(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. .や*で何もヒットしなくなることからその文字そのもので検索しているようです