2012-03-21 6 views
2

pnormやqnormのような関数を使ってRcppでC++コードを書こうとしています。私はhttps://stackoverflow.com/a/9738848/567015で説明されているように、これらのRcppの砂糖バージョンをベクトルに使うことができますが、私はベクトル上でこれを行う必要はありません。RcppでRmath.hのpnormを使用する

私が正しく理解していれば、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を使用します。これは、異なるディストリビューションに適したコードを簡単に見つけることができると思うからです。ここで

答えて

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>  

は、私たちのヘッダをより詳しく見ると、我々は(ベクトル化)を定義するために、pnormRmath.hからを未定義あなたが得るバリアントRcppシュガーから。

2012年11月14日の編集:本日発表Rcpp 0.10.0であなたはRmath.hに対して書かれたCスタイルのコードを使用したい場合は、署名R::pnorm(double, double, double, int, int)を行う呼び出すことができます。 Rcppの砂糖はまだベクトル化されたバージョンを提供します。

+0

ありがとうございました。本当にRcppの砂糖バージョンを使うのが一番簡単だと思います。 'pnorm(NumericVector(1、y)、0.0,1.0)[0]'の回避策が見つかりました。うまくいくようです。 –

+0

それは必要ありません。私が投稿した 'fx()'関数もスカラーで呼び出すことができます。すべてのRオブジェクトは、時には長さ1のベクトルであることに注意してください。 –

関連する問題