このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

R言語

グラフィックスの操作

現在のデバイス状態: dev.list() 新しいデバイスを開く: png(filename = "file.png") 詳しくは help(png) など。 カレントデバイスを知る: dev.cur() デバイスを閉じる: dev.off(番号) デバイスは番号で識別されるリングだと思って、dev.next(), dev.pre…

.Primitive vs. .Internal

.Primitiveは名前のとおり、もっともプリミティブで、引数で指定された名前のC関数へのポインタを意味する。R側ではもちろん生ポインタは扱えないので、対応するラッパ関数オブジェクトを返す。プリミティブ関数の関数ボディはCコードだが、便宜上、.Primiti…

他言語呼び出し

.C 古い .Fortran 古い .Call 標準的 .External 可変引数可能 .Internal 内部用 可変引数可能、自由度が高い。 .Primitive 内部用 名前だけ指定、最終的にここに行き着く。

search(), searchpaths(), path.packages() の関係

> search() [1] ".GlobalEnv" "package:stats" "package:graphics" "package:grDevices" [5] "package:utils" "package:datasets" "package:methods" "Autoloads" [9] "package:base" > searchpaths() [1] ".GlobalEnv" [2] "C:/Installed/R/R-3.2.2/library…

inherits

x instanceof y の代わりに、inherits(x, "y" ) が使える。

path.expand

"~"の展開とかに使える。Windoesショートネームの展開にも使えるかも。

dir()とlist.files()とfile.*()

dir()とlist.files()はたぶん同じ機能。あと、lis.dirs(), list.files() が揃っている。ファイルシステム関係は、file.*() のようだ。 > file.[TAB][TAB]file.access file.append file.choose file.copy file.create file.edit file.exists file.info file.l…

ライブラリロケーションとインストールされたパッケージ群

ライブラリロケーションは、.libPaths()関数が管理している。この関数固有の内部変数.lib.locを持っていて、そこにディレクトリ文字列のリストが保存されている。 処理系の初期化時に、デフォルトディレクトリ R.home("library") を .Library変数にセットす…

CRANミラーサーバーのリストとパッケージ一覧を得る

> mirr > class(mirr) [1] "data.frame" > names(mirr) [1] "Name" "Country" "City" "URL" "Host" "Maintainer" [7] "OK" "CountryCode" "Comment" > fix(mirr) >次は保存されているCSV表示。 > mirr csv(file.path(R.home("doc"), "CRAN_mirrors.csv")) > …

何でもリネーム可能

> 平方根 > 平方根(2) [1] 1.414214 >

プライベート関数の呼び出し

スコープ演算子:::を使う。 > utils:::.readPkgDesc(.Library, "Version") [,1] [,2] [,3] [1,] "animation" "C:/Installed/R/R-3.2.2/library" "2.4" [2,] "assertthat" "C:/Installed/R/R-3.2.2/library" "0.1" [3,] "base" "C:/Installed/R/R-3.2.2/libra…

関数をプライベートにする方法

ドットで始まる名前を使う: 安直 内部関数: 関数のフレーム内で定義する。完全に隠れる。コンパイルされてないと遅い気がする。 パッケージのプライベート: 面倒。 自分専用のスコープを準備する: そのスコープ内に定義すれば普通では見えない。.libPath…

いくつかのGUI

install.packages() (引数なし)でGUIが出る。fix()やedit()、show.file()もGUIを出す。helpもGUIと言っていいかも。

パッケージ所属関数のスコープ(解決)

パッケージ所属関数の親スコープは通常のパッケージの名前空間。名前空間からのサーチパスはグローバル環境に向かっている。グローバル環境より先のサーチパスは、パッケージの関数には無意味、あるいは有害だと思える。スコープチェーンは、グローバル環境…

deep代入の例:.libPathsの環境

" > find(".libPaths") [1] "package:base" > environment(.libPaths) > .libPathsでは、所属パッケージと環境が違う。無名環境がスコープになっている。その理由は、 > .libPaths function (new) { if (!missing(new)) { new <- Sys.glob(path.expand(new))…

deep代入は誤解しがち

http://www.is.titech.ac.jp/~mase/Rtips.html#item53 とか見ると、永続付値=deep代入を.GlobalEnvへの代入と記述している。それだと、.libPaths()のコードは理解できない。 > .libPaths function (new) { if (!missing(new)) { new <- Sys.glob(path.expan…

new.env()のイヤーなデフォルト値(誤解だった)

[追記]これは誤解[/追記] > new.env function (hash = TRUE, parent = parent.frame(), size = 29L) .Internal(new.env(hash, parent, size)) > 関数内で、new.env()すると、親スコープが親フレームになる。これはオカシイだろうよ。.GlobalEnvのparent.fram…

環境とフレームとエンクロージャ、クロージャ

「環境=フレーム+エンクロージャ」ということだが、 フレームは束縛セット(キー/値ベアの集合)であって、あえて言葉を作る必要なんてない。 単数形の束縛(binding)は使っているのだから、binding set とか a set of binding とでも言えば十分。 フレ…

歴史的遺物

Sとの互換性を考慮しているらしい。mode()とtypeof()の二本立てとか。storage.mode()もある。 かつてリストはpairlistの意味で、ベクトル(または新リスト)が今のリストだったようだ。 vectorコンストラクタでリストが作れるのはそんな理由か? これもSとの…

arrayが変だ

class(x) が"arry"と出ても、unclass(x)した後のmodeはベクトルだったりリストだったり。非常に紛らわしい。どうも、arrayは構造的タイピングのような仕掛けで、dimがあるとarrayと解釈するようだ。dimnamesも解釈する。matrixは単に次元が2の配列。これって…

for内の変数

for (i in 1:10) print(i) のiは環境を汚す。なんてこった。対処は: local({ for (i in 1:10) print(i) })

深い代入、永続代入

"ウィッカムは、"The deep assignment arrow, 関数内で

命名法の不統一

関数や変数の命名法がバラバラなのはしょうがないとしても、 > args(data.frame) function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, stringsAsFactors = default.stringsAsFactors()) NULL > args(sapply) function (X, FUN, ..., …

パッケージ理解のコツ

データ型(mode)としての環境と、役割・用途としてのスコープオブジェクト、そしてさらに特定した使い方としての名前空間オブジェクトを区別する。 名前空間は特殊なスコープオブジェクトである。 スコープオブジェクトは環境型のオブジェクトの使い途を意…

パッケージと名前

パッケージ名:パッケージディレクトリのDESCRIPTIONファイルのPackage:項目に書かれる名前。パッケージ名とVersion:によってパッケージが識別される。 (パッケージの)名前空間名: 名前空間レジストリに登録されるキー。パッケージ名と同じ。 名前空間の…

plyrとpryrは違う

紛らわしい。どちらもハドリー・ウィッカムの有能なライブラリ。 ply【2自動】せっせと働く〔船・バスなどが〕定期的に往復する【2他動】〔道具などを〕せっせと使う〔仕事などに〕精を出す〔船が川を〕定期航行する〔バスなどが道を〕定期的に往復する pry…

.BaseNamespaceEnv と baseenv() は違う

baseのエクスポーター(公開記述)は、as.environment(length(search())) で得られる。 .BaseNamespaceEnvはbaseenv()とは別で、baseパッケージの名前空間オブジェクトを指す。 > length(ls(.BaseNamespaceEnv, all.names=T)) # .BaseNamespaceEnv の名前個…

エクスポーターは名前空間ではない

isNamespace(x) でTRUEが返るものを(狭義の)名前空間と呼ぶなら。パッケージが提供するエクスポーターオブジェクト(環境名は package:パッケージ名)は名前空間ではない。名前空間はgetNamespace(名前空間名) で得られたものだけである。

名前空間の操作

↓は古い論説だが、必要なことはだいたい書いてある。 http://homepage.stat.uiowa.edu/~luke/R/namespaces/morenames.pdf 基本的な操作方法: nsreg 名前空間データベース(namespace registory)を取得する。名前空間データベースは環境オブジェクトである…

名前空間関係の隠された名前/隠されてない名前

> ls(.BaseNamespaceEnv, pattern="^\\..*Namespace", all.names=T) [1] "..getNamespace" ".BaseNamespaceEnv" ".getNamespace" ".getNamespaceInfo" [5] ".methodsNamespace"名前空間オブジェクト(環境)を指す名前:、 .BaseNamespaceEnv .methodsNamesp…