2013年3月24日日曜日

Rの概観メモ; 少々C++er視点

認識:
  • Rは…
    •  誤った認識: × すごいえくせる
    •  正しい認識: ○ プログラミング言語R
情報源: 
Rの概観メモ; 少々C++er視点:
  • 処理系の特性
    • 実行形態
      • インタープリター型のスクリプト言語
        (※必要ならユーザーがC, C++, Fortranでネイティブコードな共有ライブラリー型のプラグインを書いて拡張もできる 
    • マルチパラダイム
      • (一応)オブジェクト指向
      • 関数型の記述が可能
        (※R文化圏では好まれる(らしい))
      • 手続き型な記述も可能
        (※R文化圏では馬鹿にされる(らしい))
    • 型システム
      • 動的型付け
  • ソースファイル
    • 慣例により .R 拡張子を用いる
      (ほかに .S .q .s .r も使われてきた(らしい))
    • テキスト
      • UTF-8対応
        (環境の設定確認方法など →
  • 実行方法
    • `Rscript my_script_file.R`
      • `R --no-save --slave < my_script_file.R`でも同様
        (`Rscript`はELFだったのでまったく同じとも言えないが…)
    • or `R`でインタラプト型のインタープリターを使う
  • 言語仕様の要点
    基本構文はC風と思って使い始めて大丈夫そう)
    • トークン分離記号
      • ;
        (改行でも分離されるから毎行に必須ではない)
    • グルーピング
      • { } (≈ステートメントブロック+ラムダ式
        (注: 但し変数のスコーピングにはならない)
    • 変数
      (この世界は基本的には大域変数だけでできている)
      • シンボル命名
        • 大文字小文字の区別あり
        • 言語構造や型の予約語は使用不可
          (ifとかダメ)
        • 演算子を含まない
          (abc-defとかダメ)
        • 数字で始まらない
          (8bitとかダメ)
        • 日本語でも構わない
          (おわた="\(^o^)/"とか処理上は問題ない
      • オブジェクトの束縛
        • hoge <- 123 (推奨構文)
          • hoge = 123 (これでも同じ効果)
          • 123 -> hoge (これでも同じ効果)
    • コメント
    • オブジェクトの型
      • プログラミングに際し直接意識的に扱うオブジェクト
        • 空ぽ
          • NULL
            (NullでもnullでもnilなくNULL
        • 欠損値
        • コンテナー
          • Vector ; 下記「値」からなる要素集合
            (この世界のデータは基本的にVectorでできている)
            • 構築方法: c(1,2,3,4) 
              (異なる要素型は許容できず暗黙の型変換が発生する
        • コンテナーの要素
          (暗黙的であれコンテナーに格納された状態でのみ実在可能)
          • logical ; 論理値 T F TRUE FALSE
          • integer ; 整数 1 2 3
          • double ; 実数 1.2 .34 5.6e+7 
          • complex ; 複素数 1+2i
            • リテラルの+前後にwhitespaceがあっても良い
            • iの直前に数が無いとリテラルとして成立しない
              • complexとしてはダメな例: 3+i
          • character ; 文字
          • raw ; 生バイト
        • 複合的なコンテナー
          • List ; 複合的な要素集合
            (異なるVector型を要素として含むListとか)
            • 構築方法: list(c(1,2,3),4+5i,"hoge")
        • 2次元行列
          • Matrix (Arrayの2次元特殊化)
        • N次元行列
        • データフレーム
          (意味付け付きの列VectorのListみたいな)
      • その他
        (言語仕様に深い興味が無ければ気にしなくても良い(と思われる))
    • 制御構造
      • 分岐
        • if-else(C系のソレの感覚で使える。
          …しかしどうやらifelse()関数も用意されているらしい)
        • switch(注、これはつまり関数ネ)
      • ループ
        apply()系で済む事を制御構造でやるとR世界では不評らしい。C++erなら基本的にrange-basedの様な概念で当たればよいだろう)
        • repeat (for(;;))
        • while (C系のソレの感覚で使える)
        • for(C系のソレの感覚で使える)
        • break (ループ中でC系のソレの感覚で使える)
    • 演算子
      • 単項
        • - + ! (加、減、論理否定。Cのソレと同様)
        • ~ (????よーわからん)
        • ? ?? (ヘルプ演算子。 ?NULLとかするとヘルプを引いてくれる
      • 二項
        • : (シーケンス演算子。1:3でc(1,2,3)の効果
        • * / (積、商。Cのソレと同様)
        • ^ (冪乗。C++なら std::pow()相当 
        • %% (剰余。Cなら%相当。実数での挙動に注意
        • %/% (整数の商
        • %*% (行列の積)
        • %o% (外積
        • %x% (クロネッカー積)
        • %in% (マッチ。左辺が右辺の要素集合に含まれるか
        • < > == >= <=(比較。C系のソレに同じ
        • && || (C系のソレに同じ。結果は単一要素)
        • & | (&&と||のベクター化版。違いの分かるサンプル
        • $ (????よーわからん)
      • 特殊
        • %x% (プレースメントホルダー)
        • <- -> (左へ、右へ、変数への束縛
      • 要素アクセス
        • [ ] (インデックスによる抽出またはフィルターが可能 
          • 但し、R世界の要素インデックスは1から始まる
    • 関数 関数もオブジェクト
      • 定義と呼び出し:
        •  function(a,b){ z = a+b }
          • 仮引数
            • 型ヒントとかシグニチャによるオーバーロードとか無い
            • デフォルト引数使用可能(b="hoge"とか)
            • 仮引数シンボル名により呼び出し時に引数順序非依存が可能
          • 最後に評価したステートメントがreturnになる
            (return関数で明示も可能)
          • 関数スコープが有効
            • 変数は関数スコープのローカル変数となる
            • 仮引数もローカル変数と同様
      • シンボルへの束縛: (変数に同じ)
        • x <- function(a,b){ a+b }
        • x = function(a,b){ a+b }
        • {function(a,b){ a+b }} -> y
    • 評価戦略
    • OOP
      (S4言語仕様に倣ったOOPが可能…な様だ。しかし私はその存在を確認するに留め、このダンジョンには入らない事にした。)
    • 例外
    • デバッグ機能
      • デバッグプロンプトを出す
      • トレース
        • 変数や構文にトレースを仕掛ける
          • trace() untrace()
            (トレーサー関数も書き換えられる程度に強力)
        • 直前のエラー発生位置を確認
    • その他の組み込み機能
うーむ、The R language definitionを読んで見たらどうも詳細や項目が足りな過ぎると思ったらAn Introduction to Rの方に凡そ書いてあるのなー(;´Д`)

とか、少々要点をまとめるだけのつもりが相当端折ってもこんな事になってしまいました。簡単なデータ処理と可視化には十分だと思えるので、とりあえず今回のR入門はここまで(*´ω`*)

(※このまとめはわたしが主観的に分類したり抜粋したりした内容であり、Rの正式な呼称や分類やマニュアルの記載に完全に忠実ではありません。真の情報は言語公式サイトから言語仕様書等を読んで下さい。)

0 件のコメント:

コメントを投稿