私はRのリストをループし、リストの各Rオブジェクトのプライマリクラス(S3クラスの場合は最初の要素として定義されています)を抽出しています。 RcppからジェネリックR関数を呼び出すことは可能ですが、これを避けたいと思います。私がこれを追求するのは、パフォーマンスのためです。Rのprimitive "class"関数にRcppでアクセスすることは可能ですか?
Rのプリミティブ関数へのアクセスに関して別の質問がありました。 use primitive functions in RcppとRcppの砂糖表現がその問題を解決したように見えますが、Rcppシュガーでは 'class'のようには見えません。
私は、Rcppの属性(S3クラスがどのように格納されているか)にアクセスできることを知っています。また、S4オブジェクトがRcppで検出可能であることも知っていますので、これを行う方法はおそらくあります。最も簡単なプリミティブなクラス関数は直接呼び出し可能で、私は何かが欠落しています。
library(Rcpp)
objList <- list(
a = 10,
b = lm(mpg~cyl, data = mtcars),
c = glm(mpg~cyl, data = mtcars, family = gaussian)
)
##R approach
primaryClass <- function(x){
class(x)[1]
}
vapply(objList, primaryClass, character(1))
##Rcpp skeleton approach
cppFunction('CharacterVector primaryClass(List x) {
int nrow = x.size();
CharacterVector out(nrow);
for (int i = 0; i < nrow; i++) {
out[i] = "classHere";
}
return out;
}')
primaryClass(objList)
コードをプロファイリングしましたか?これがボトルネックですか? –
はい - これはボトルネックの1つです。しかし、それがなかったとしても、私はまだメカニックに興味があります... – rlh2