Rcpp、赋值错误、SEXPREC*的含义
Rcpp, Value Assignment Error, Meaning of SEXPREC*
我在Rcpp中写了如下代码
//#include <Rcpp.h>
#include <RcppArmadilloExtensions/sample.h>
#include <random>
#include <iostream>
using namespace Rcpp;
// [[Rcpp::export]]
arma::vec SimulBetaBin(int K, arma::vec N){
arma::vec D;
Environment pkg = Environment::namespace_env("extraDistr");
Function f = pkg["rbbinom"];
for(int i=0; i<K; ++i){
D[i] = f(1, N[i], 1, 1);
}
return D;
}
此函数的目的是模拟 Beta 二项分布。
但是,当我在 R 中编译代码时,出现以下错误
error: cannot convert 'SEXP' {aka 'SEXPREC*'} to 'double' in assignment
D[i] = f( N[i], 1, 1);
^
我试图理解 SEXPREC*
是什么,但我变得更加困惑
What R users think of as variables or objects are symbols which are bound to a value. The value can be thought of as either a SEXP (a pointer), or the structure it points to, a SEXPREC
,这是什么意思??
因为我想我必须先理解这一点才能解决错误。
万一
你从调用 Rcpp::Function()
object 得到了 SEXP
,所以你需要转换它。下面是函数的修改版本(也将 headers 简化为您实际使用和需要的版本),这个版本是为我编译的。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec SimulBetaBin(int K, arma::vec N) {
arma::vec D;
Rcpp::Environment pkg = Rcpp::Environment::namespace_env("extraDistr");
Rcpp::Function f = pkg["rbbinom"];
for (int i=0; i<K; ++i) {
SEXP val = f(1, N[i], 1, 1);
D[i] = Rcpp::as<double>(val);
}
return D;
}
编辑: 删除了另一个未使用的 header。
我在Rcpp中写了如下代码
//#include <Rcpp.h>
#include <RcppArmadilloExtensions/sample.h>
#include <random>
#include <iostream>
using namespace Rcpp;
// [[Rcpp::export]]
arma::vec SimulBetaBin(int K, arma::vec N){
arma::vec D;
Environment pkg = Environment::namespace_env("extraDistr");
Function f = pkg["rbbinom"];
for(int i=0; i<K; ++i){
D[i] = f(1, N[i], 1, 1);
}
return D;
}
此函数的目的是模拟 Beta 二项分布。 但是,当我在 R 中编译代码时,出现以下错误
error: cannot convert 'SEXP' {aka 'SEXPREC*'} to 'double' in assignment
D[i] = f( N[i], 1, 1);
^
我试图理解 SEXPREC*
是什么,但我变得更加困惑
What R users think of as variables or objects are symbols which are bound to a value. The value can be thought of as either a SEXP (a pointer), or the structure it points to, a SEXPREC
,这是什么意思??
因为我想我必须先理解这一点才能解决错误。
万一
你从调用 Rcpp::Function()
object 得到了 SEXP
,所以你需要转换它。下面是函数的修改版本(也将 headers 简化为您实际使用和需要的版本),这个版本是为我编译的。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec SimulBetaBin(int K, arma::vec N) {
arma::vec D;
Rcpp::Environment pkg = Rcpp::Environment::namespace_env("extraDistr");
Rcpp::Function f = pkg["rbbinom"];
for (int i=0; i<K; ++i) {
SEXP val = f(1, N[i], 1, 1);
D[i] = Rcpp::as<double>(val);
}
return D;
}
编辑: 删除了另一个未使用的 header。