2

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のは、さまざまなディストリビューションに適したコードを見つけやすくするためです。

4

1 に答える 1

3

以下は、Rcpp でより自然な Rcpp 糖バリアントです。

R> library(inline)
R> 
R> Src <- '
+ NumericVector y = NumericVector(x);
+ NumericVector res = pnorm(y,0.0,1.0);
+ return res;
+ '
R> 
R> fx <-  cxxfunction( signature(x = "numeric") , body=Src, plugin = "Rcpp")
R> 
R> fx(seq(0.8, 1.2, by=0.1))
[1] 0.788145 0.815940 0.841345 0.864334 0.884930
R> 
R> fx(1.0)      ## can also call with scalar args
[1] 0.841345
R> 

ヘッダーを詳しく見てみると、Rcpp sugar から取得する (ベクトル化された) バリアントを定義するために、 pnormet al fromを未定義にしています。Rmath.h

2012-11-14 の編集: 今日リリースされた Rcpp 0.10.0 ではR::pnorm(double, double, double, int, int)Rmath.h. Rcpp sugar は、ベクトル化されたバージョンを提供します。

于 2012-03-21T14:10:00.693 に答える