Rのハラワタ
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Rのハラワタ

  • 3,207 views
Uploaded on

R言語の動作解説初級編

R言語の動作解説初級編

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,207
On Slideshare
2,930
From Embeds
277
Number of Embeds
4

Actions

Shares
Downloads
18
Comments
0
Likes
4

Embeds 277

http://d.hatena.ne.jp 254
https://twitter.com 21
http://twitter.com 1
http://paper.li 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Rのハラワタをちょっとだけ見てみる
    TokyoR
    2010/8/28
    Nikoriks
  • 2. 自己紹介
    誰:26歳で起業=人生の半分より前
    過:K-Prolog Compiler を作りました。
    過:S をBell Labs.と契約して、日本に持ってきました。(アイザック)
      日本語化やGUI化をして売りました。(社員が)
      SやRから離れて、ん10年
    故:大規模計算、大規模データ、Rが注目される時代になった
    興:えさを与えて育てること
      Ex.天然酵母パン、味噌、ビール風飲料、ベンチャー企業
    趣:ギャンブル=麻雀と人生
    言語処理系がもともと専門、統計については知識なし
  • 3. 本発表の目的と野望
    目的
    • R言語がどうやって動くのか、およそのところを知る
    • 4. Rを使っていて意図しない動作があったときに、原因を想像したり
     自分で調べられる範囲を広げる
    • Rに限らず言語処理系がどういう風に動くのか、想像出来るようになる
    野望
    • この辺の人口を増やしてR言語の開発に参加できる人を日本から出す 
    • 5. Rや統計以外の分野に限らず、DSL(Domain Specific Language)を 作れる人を見つける
  • R internals
    Rの実装についてのドキュメント
    http://cran.r-project.org/doc/manuals/R-ints.html
    今日は、
    ・Rは式をどうやって評価するか
    ・SEXPとは
    ・関数の呼び出し
    ・repeat,while,for
    ・tapply,apply,lapply
    そのうちやりたいこと
    ・NAという表現
    ・関数の引数の仕組み
    ・世代別GC
    ・文字と文字列
    ・S3/S4って何?
    言語処理系の実装に関する知識がない人が理解できるように進行するつもりです。
  • 6. R は式をどうやって評価するか
    RのプログラムもデータもSEXPというデータ構造である
    ・プログラムをファイルから読む
    ・トップレベルで入力する
    プログラムは、構文の構造をそのまま表す木をSEXPで内部表現
    ・関数、for、代入などそのまま
    インタプリタはC言語で書かれている
    ・eval()という関数がSEXPを評価する
    構文要素におよそ対応して、評価する関数がある
  • 7. Rのトップレベル
    main.c:
    /* Read-Eval-Print Loop */
    for(;;) {
    R_PPStackTop = savestack;
    R_CurrentExpr = R_Parse1File(fp, 1, &status, &ParseState);
    switch (status) {
    case PARSE_OK:
    ...
    PROTECT(R_CurrentExpr);
    R_CurrentExpr = eval(R_CurrentExpr, rho);
    SET_SYMVALUE(R_LastvalueSymbol, R_CurrentExpr);
    UNPROTECT(1);
    if (R_Visible)
    PrintValueEnv(R_CurrentExpr, rho);
    }
  • 8. eval()
    評価する式
    eval.c
    SEXP eval(SEXP e, SEXP rho)
    switch (TYPEOF(e)) {
    case NILSXP:
    case LISTSXP:
    ....
    case LANGSXP:
    if (TYPEOF(CAR(e)) == SYMSXP)
    if (TYPEOF(op) == SPECIALSXP) {
    }
    環境(どこで呼び出されたか、変数はどうなっているか)
    教えて:rhoは何の略?
    構文要素による場合分け
  • 9. SEXPのデータ構造
    SEXPREC=*SEXPR
    structsxpinfo_structsxpinfo;
    struct SEXPREC *attrib;
    struct SEXPREC *gengc_next_node, *gengc_prev_node
    union {}
    ・3ワードのへダー
    ・実データ(へダーのあとunionのところ)
    ・境界整列のための仕掛け
  • 10. 関数の呼び出し
    普通の関数の場合
    PROTECT(op = findFun(CAR(e), rho));
    PROTECT(tmp = promiseArgs(CDR(e), rho)); /* arglist */
    SEXP applyClosure(SEXP call, SEXP op, SEXP arglist,
    SEXP rho, SEXP suppliedenv) 
    SETJMP(cntxt.cjmpbuf)
    PROTECT(tmp = eval(body, newrho))
    ・applyClosureは、引数を処理して関数本体をeval()
    ・return がlongjmpなので、setjmpを準備
    return
    do_return(SEXP call, SEXP op, SEXP args, SEXP rho)
    findcontext(int mask, SEXP env, SEXP val)
    LONGJMP(cptr->cjmpbuf, mask);
  • 11. 引数をevalしないとき
    ・引数を処理して、関数本体をeval()
    ・specialfunctions の場合は、引数をevalしない
    Special function は引数を評価しない点がbuiltinと異なる
  • 12. 環境を作る
    SEXP NewEnvironment(SEXP namelist, SEXP valuelist, SEXP rho){
    newrho->sxpinfo = UnmarkedNodeTemplate.sxpinfo;
    TYPEOF(newrho) = ENVSXP;
    FRAME(newrho) = valuelist;
    ENCLOS(newrho) = rho;
    HASHTAB(newrho) = R_NilValue;
    ATTRIB(newrho) = R_NilValue;
    v = valuelist;
    n = namelist;
    while (v != R_NilValue && n != R_NilValue) {
    SET_TAG(v, TAG(n));
    v = CDR(v);
    n = CDR(n);
    }
    return (newrho);
    }
    actual
    formal
  • 13. repeat,while
    repeatstatement
    do_repeat(SEXP call, SEXP op, SEXP args, SEXP rho)
    body = CAR(args);
    for (;;) {
    eval(body, rho);
    }
    while (statement1) statement2
    do_while(SEXP call, SEXP op, SEXP args, SEXP rho)
    while (asLogicalNoNA(eval(CAR(args), rho), call)) {
    eval(body, rho);
    }
    ・繰り返し構文は、C言語レベルでも繰り返しで処理
  • 14. for
    for (name in vector) statement1
    do_for(SEXP call, SEXP op, SEXP args, SEXP rho)
    val = CADR(args);
    body = CADDR(args)
    if (isList(val) || isNull(val)) {
    n = length(val);
    PROTECT_WITH_INDEX(v = R_NilValue, &vpi);
    }
    else {
    n = LENGTH(val);
    PROTECT_WITH_INDEX(v = allocVector(TYPEOF(val), 1), &vpi);
    }
    for (i = 0; i < n; i++) {
    switch (TYPEOF(val)) {
    case LGLSXP:
    ...
    }
    REPROTECT(ans = eval(body, rho), api);
    }
    ・for文を処理してnを求め、本体をn回繰り返す
  • 15. lapplyなど
    apply.c
    /* .Internal(lapply(X, FUN)) */
    do_lapply(SEXP call, SEXP op, SEXP args, SEXP rho)
    PROTECT(XX = eval(CAR(args), rho));
    FUN = CADR(args); /* must be unevaluated for use in e.g. bquote */
    n = length(XX);
    ..
    PROTECT(R_fcall = LCONS(FUN, LCONS(tmp, LCONS(R_DotsSymbol, R_NilValue))));
    for(i = 0; i < n; i++) {
    INTEGER(ind)[0] = i + 1;
    SET_VECTOR_ELT(ans, i, eval(R_fcall, rho));
    }
    要素を引数として繰り返し
  • 16. To be continued
  • 17. ちょこっと宣伝
    Rによるソーシャルネットワーク分析入門
    日時:2010年9月11日(土) 10:30~16:40 
    講師:鈴木努氏 (東京工業大学)
    内容:R を使ったソシアルネットワーク分析の理論と分析法
    場所:ソフトウェア科学会全国大会併設チュートリアル
       @津田塾大学 小平キャンパス
    参加費:12,000円(学生は4,000円) 会員は半額
    詳しくは、http://www.jssst.or.jp/ 全国大会案内にあります