Я пытаюсь написать кусок кода C ++ с помощью Rcpp, используя такие функции, как pnorm и qnorm. Я могу использовать версии Rcpp Sugar для этих векторов, как описано в https://stackoverflow.com/a/9738848/567015,, но мне не нужно делать это на векторе, а только на двойном.
Если я правильно понимаю, я могу использовать префикс 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
, потому что я думаю, что это облегчает поиск правильных кодов для разных дистрибутивов.