SlideShare a Scribd company logo
1 of 16
Rのハラワタをちょっとだけ見てみる TokyoR 2010/8/28 Nikoriks
自己紹介 誰:26歳で起業=人生の半分より前 過:K-Prolog Compiler を作りました。 過:S をBell Labs.と契約して、日本に持ってきました。(アイザック)    日本語化やGUI化をして売りました。(社員が)   SやRから離れて、ん10年 故:大規模計算、大規模データ、Rが注目される時代になった 興:えさを与えて育てること   Ex.天然酵母パン、味噌、ビール風飲料、ベンチャー企業 趣:ギャンブル=麻雀と人生 言語処理系がもともと専門、統計については知識なし
本発表の目的と野望 目的 ,[object Object]
 Rを使っていて意図しない動作があったときに、原因を想像したり 自分で調べられる範囲を広げる ,[object Object],野望 ,[object Object]
 Rや統計以外の分野に限らず、DSL(Domain Specific Language)を 作れる人を見つける,[object Object]
R は式をどうやって評価するか RのプログラムもデータもSEXPというデータ構造である ・プログラムをファイルから読む ・トップレベルで入力する プログラムは、構文の構造をそのまま表す木をSEXPで内部表現 ・関数、for、代入などそのまま インタプリタはC言語で書かれている ・eval()という関数がSEXPを評価する 構文要素におよそ対応して、評価する関数がある
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); }
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は何の略? 構文要素による場合分け
SEXPのデータ構造 SEXPREC=*SEXPR structsxpinfo_structsxpinfo;  struct SEXPREC *attrib;  struct SEXPREC *gengc_next_node, *gengc_prev_node     union {} ・3ワードのへダー ・実データ(へダーのあとunionのところ) ・境界整列のための仕掛け
関数の呼び出し 普通の関数の場合 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);
引数をevalしないとき ・引数を処理して、関数本体をeval() ・specialfunctions の場合は、引数をevalしない Special function は引数を評価しない点がbuiltinと異なる
環境を作る 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
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言語レベルでも繰り返しで処理
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回繰り返す
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));   } 要素を引数として繰り返し
To be continued

More Related Content

More from Nobukuni Kino

Fossライセンスとビジネス
FossライセンスとビジネスFossライセンスとビジネス
FossライセンスとビジネスNobukuni Kino
 
そういえばRとはなんだったか
そういえばRとはなんだったかそういえばRとはなんだったか
そういえばRとはなんだったかNobukuni Kino
 
ソフトウェアの権利とOSS,CC
ソフトウェアの権利とOSS,CCソフトウェアの権利とOSS,CC
ソフトウェアの権利とOSS,CCNobukuni Kino
 

More from Nobukuni Kino (6)

未踏事業とは
未踏事業とは未踏事業とは
未踏事業とは
 
Fossライセンスとビジネス
FossライセンスとビジネスFossライセンスとビジネス
Fossライセンスとビジネス
 
Bitcoin2014
Bitcoin2014Bitcoin2014
Bitcoin2014
 
Julia入門
Julia入門Julia入門
Julia入門
 
そういえばRとはなんだったか
そういえばRとはなんだったかそういえばRとはなんだったか
そういえばRとはなんだったか
 
ソフトウェアの権利とOSS,CC
ソフトウェアの権利とOSS,CCソフトウェアの権利とOSS,CC
ソフトウェアの権利とOSS,CC
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 

Recently uploaded (8)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 

Rのハラワタ

  • 2. 自己紹介 誰:26歳で起業=人生の半分より前 過:K-Prolog Compiler を作りました。 過:S をBell Labs.と契約して、日本に持ってきました。(アイザック)   日本語化やGUI化をして売りました。(社員が)   SやRから離れて、ん10年 故:大規模計算、大規模データ、Rが注目される時代になった 興:えさを与えて育てること   Ex.天然酵母パン、味噌、ビール風飲料、ベンチャー企業 趣:ギャンブル=麻雀と人生 言語処理系がもともと専門、統計については知識なし
  • 3.
  • 4.
  • 5.
  • 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)); } 要素を引数として繰り返し
  • 17. ちょこっと宣伝 Rによるソーシャルネットワーク分析入門 日時:2010年9月11日(土) 10:30~16:40  講師:鈴木努氏 (東京工業大学) 内容:R を使ったソシアルネットワーク分析の理論と分析法 場所:ソフトウェア科学会全国大会併設チュートリアル    @津田塾大学 小平キャンパス 参加費:12,000円(学生は4,000円) 会員は半額 詳しくは、http://www.jssst.or.jp/ 全国大会案内にあります