SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Mehr von Nobukuni Kino

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

Mehr von 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
 

Kürzlich hochgeladen

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 

Kürzlich hochgeladen (10)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 

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/ 全国大会案内にあります