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
を使用します。これは、異なるディストリビューションに適したコードを簡単に見つけることができると思うからです。ここで
ありがとうございました。本当にRcppの砂糖バージョンを使うのが一番簡単だと思います。 'pnorm(NumericVector(1、y)、0.0,1.0)[0]'の回避策が見つかりました。うまくいくようです。 –
それは必要ありません。私が投稿した 'fx()'関数もスカラーで呼び出すことができます。すべてのRオブジェクトは、時には長さ1のベクトルであることに注意してください。 –