Rのハラワタ

3,402 views
3,222 views

Published on

R言語の動作解説初級編

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,402
On SlideShare
0
From Embeds
0
Number of Embeds
325
Actions
Shares
0
Downloads
22
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Rのハラワタ

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

×