pnorm や qnorm などの関数を使用して、Rcpp で C++ コードを作成しようとしています。https://stackoverflow.com/a/9738848/567015で説明されているように、これらの Rcpp シュガー バージョンをベクターに使用できますが、ベクターでこれを行う必要はなく、double でのみ行う必要があります。
正しく理解できれば、Rf_
プレフィックスを使用して Rmath.h からスカラー バージョンを取得できます。ただし、Rf_pnorm
機能しません:
library("inline")
Src <- '
double y = as<double>(x);
double res = Rf_pnorm(y,0.0,1.0);
return wrap(res) ;
'
fx <- cxxfunction( signature(x = "numeric") ,Src, plugin = "Rcpp" )
fx(1)
エラーとして与える:
file10c81a585dee.cpp: In function 'SEXPREC* file10c81a585dee(SEXP)':
file10c81a585dee.cpp:32:32: error: 'Rf_pnorm' was not declared in this scope
いくつかのグーグルと試行錯誤の結果、Rf_pnorm5
機能しますが、下側のテールと対数スケールに追加のパラメーターが必要であることがわかりました。
Src <- '
double y = as<double>(x);
double res = Rf_pnorm5(y,0.0,1.0,1,0);
return wrap(res) ;
'
fx <- cxxfunction( signature(x = "numeric") ,Src, plugin = "Rcpp" )
fx(1)
## [1] 0.8413447
素晴らしいですが、なぜこれが機能するのに機能しないのかわかりRf_pnorm
ません。むしろ使用するRf_pnorm
のは、さまざまなディストリビューションに適したコードを見つけやすくするためです。