トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

BugTrack-R備忘録/32

R備忘録 /状態空間モデリング/donlp2/その他のメモ

R備忘録 - 記事一覧

C言語のAPI tips(文字列をevalする・文字列を実行する)

  • 投稿者: みゅ
  • カテゴリ: なし
  • 優先度: 普通
  • 状態: 完了
  • 日時: 2009年06月09日 08時28分13秒

内容

  • 文字列をevalする・文字列を実行する

文字列をevalする・文字列を実行する

  • 例えば以下を実行したい
strsplit(paste(" ", string1, sep=""),  NULL)[[1]]
  • こんな感じ?
  char *cmd2 = "strsplit(paste(\" \", string1, sep=\"\"),  NULL)[[1]]";  //文字列を作成
  SET_STRING_ELT(cv, 0, mkChar(cmd2));  //文字列変数に入れる
  call = R_ParseVector(cv, 1, &status);  //評価したい式(あるいは改行)の個数がわかっている場合
  //call = parseString(cmd1, &parts, &status);  //わからない場合(つまりどんな文字列が来ても良い場合)はこれ
  PROTECT(call2 = lang2(install("eval"), call));  //eval関数にセットする
  PROTECT(s1 = eval(call2, rho));  //評価すると、戻り値がs1に入る
  • これを使うと、R側で定義した関数をCの中で評価(実行)できる

parseString関数、確か、Rserveに書いてあった関数

SEXP parseString(char *s, int *parts, ParseStatus *status) {
    int maxParts=1;
    char *c=s;
    SEXP cv, pr = R_NilValue;
    while (*c) {
		if (*c=='\n' || *c==';') maxParts++;
		c++;
    }
    PROTECT(cv=allocVector(STRSXP, 1));
    SET_VECTOR_ELT(cv, 0, mkChar(s));  
    while (maxParts>0) {
		pr=R_ParseVector(cv, maxParts, status);
		if (*status!=PARSE_INCOMPLETE && *status!=PARSE_EOF) break;
		maxParts--;
    }
    UNPROTECT(1);
    *parts=maxParts;
    return pr;
}
  • 「SEXP pr = R_NilValue;」のように、ポインタの場所を先に確保しておけば、この関数を呼び出した先で、PROTECTしなくても、よいのかな・・・?

コメント