【发布时间】:2012-03-21 12:56:59
【问题描述】:
我正在尝试使用 pnorm 和 qnorm 等函数使用 Rcpp 编写一段 C++ 代码。我可以按照https://stackoverflow.com/a/9738848/567015 中的说明将这些的 Rcpp 糖版本用于向量,但我不需要在向量上执行此操作,而只需在双精度上执行此操作。
如果我理解正确,我可以使用 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,因为我认为这样可以更轻松地为不同的发行版找到正确的代码。
【问题讨论】: