为什么在 Rcpp 中使用 "pnorm" 会出现错误
Why do I get the error for using "pnorm" in Rcpp
我需要在我的 Rcpp 代码中包含来自 arma::
的变量。但是我 运行 在尝试使用 sugar 函数 pnorm
时遇到了问题。这是一个演示:
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double pget(NumericVector x, NumericVector beta) {
arma::colvec xx = Rcpp::as<arma::colvec>(x) ;
arma::colvec bb = Rcpp::as<arma::colvec>(beta) ;
double tt = as_scalar( arma::trans(xx) * bb);
double temp = Rcpp::pnorm(tt);
return temp;
}
然后我得到一个错误:no matching function for call to 'pnorm5'
这是否意味着我不能使用 Rcpp::pnorm
???
Rcpp
糖函数适用于矢量类型参数,如 Rcpp::NumericVector
。对于标量参数,您可以使用 R
命名空间中的函数:
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double pget(NumericVector x, NumericVector beta) {
arma::colvec xx = Rcpp::as<arma::colvec>(x) ;
arma::colvec bb = Rcpp::as<arma::colvec>(beta) ;
double tt = as_scalar( arma::trans(xx) * bb);
double temp = R::pnorm(tt, 0.0, 1.0, 1, 0);
return temp;
}
/*** R
x <- rnorm(5)
beta <- rnorm(5)
pget(x, beta)
*/
顺便说一句,这里有两个变体。第一个变体使用 arma
而不是 Rcpp
向量作为参数。由于这些是 const
个引用,因此不会复制任何数据。另外,使用arma::dot
:
// [[Rcpp::export]]
double pget2(const arma::colvec& xx, const arma::colvec& bb) {
double tt = arma::dot(xx, bb);
return R::pnorm(tt, 0.0, 1.0, 1, 0);
}
第二个变体计算标量积而不求助于犰狳:
// [[Rcpp::export]]
double pget3(NumericVector x, NumericVector beta) {
double tt = Rcpp::sum(x * beta);
return R::pnorm(tt, 0.0, 1.0, 1, 0);
}
与 Rcpp 的@RalfStubner 相比,我不是专家,所以我不得不四处寻找(在 Whosebug and the Rcpp cheat sheat 的帮助下)以获取以下代码。我没有在标量上使用 R 命名空间版本,而是转换回 NumericVector
... 这几乎肯定可以由真正知道自己在做什么的人多做几步 efficiently/skipping。 .. 例如arma-to-NumericVector 的转换可以直接完成而无需通过 as_scalar
... ?
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
#include <Rcpp.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
NumericVector pget(NumericVector x, NumericVector beta) {
colvec xx = as<colvec>(x) ;
colvec bb = as<colvec>(beta) ;
double tt = as_scalar(trans(xx) * bb);
NumericVector tt2 = NumericVector::create( tt );
NumericVector temp = Rcpp::pnorm(tt2);
return temp;
}
我需要在我的 Rcpp 代码中包含来自 arma::
的变量。但是我 运行 在尝试使用 sugar 函数 pnorm
时遇到了问题。这是一个演示:
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double pget(NumericVector x, NumericVector beta) {
arma::colvec xx = Rcpp::as<arma::colvec>(x) ;
arma::colvec bb = Rcpp::as<arma::colvec>(beta) ;
double tt = as_scalar( arma::trans(xx) * bb);
double temp = Rcpp::pnorm(tt);
return temp;
}
然后我得到一个错误:no matching function for call to 'pnorm5'
这是否意味着我不能使用 Rcpp::pnorm
???
Rcpp
糖函数适用于矢量类型参数,如 Rcpp::NumericVector
。对于标量参数,您可以使用 R
命名空间中的函数:
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double pget(NumericVector x, NumericVector beta) {
arma::colvec xx = Rcpp::as<arma::colvec>(x) ;
arma::colvec bb = Rcpp::as<arma::colvec>(beta) ;
double tt = as_scalar( arma::trans(xx) * bb);
double temp = R::pnorm(tt, 0.0, 1.0, 1, 0);
return temp;
}
/*** R
x <- rnorm(5)
beta <- rnorm(5)
pget(x, beta)
*/
顺便说一句,这里有两个变体。第一个变体使用 arma
而不是 Rcpp
向量作为参数。由于这些是 const
个引用,因此不会复制任何数据。另外,使用arma::dot
:
// [[Rcpp::export]]
double pget2(const arma::colvec& xx, const arma::colvec& bb) {
double tt = arma::dot(xx, bb);
return R::pnorm(tt, 0.0, 1.0, 1, 0);
}
第二个变体计算标量积而不求助于犰狳:
// [[Rcpp::export]]
double pget3(NumericVector x, NumericVector beta) {
double tt = Rcpp::sum(x * beta);
return R::pnorm(tt, 0.0, 1.0, 1, 0);
}
与 Rcpp 的@RalfStubner 相比,我不是专家,所以我不得不四处寻找(在 Whosebug and the Rcpp cheat sheat 的帮助下)以获取以下代码。我没有在标量上使用 R 命名空间版本,而是转换回 NumericVector
... 这几乎肯定可以由真正知道自己在做什么的人多做几步 efficiently/skipping。 .. 例如arma-to-NumericVector 的转换可以直接完成而无需通过 as_scalar
... ?
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
#include <Rcpp.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
NumericVector pget(NumericVector x, NumericVector beta) {
colvec xx = as<colvec>(x) ;
colvec bb = as<colvec>(beta) ;
double tt = as_scalar(trans(xx) * bb);
NumericVector tt2 = NumericVector::create( tt );
NumericVector temp = Rcpp::pnorm(tt2);
return temp;
}