0

我的代码如下

#include <RcppArmadillo.h>
#include <Rcpp.h> 

using namespace std;
using namespace Rcpp;
using namespace arma;
//RNGScope scope; 

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]

arma::mat hh(arma::mat Z, int n, int m){
    
    if(Z.size()==0){
        
        Z = arma::randu<mat>(n,m); # if matrix Z is null, then generate random numbers to fill in it
        return Z;
    
    }else{
        
        return Z;
    }
}

报错:

conflicting declaration of C function 'SEXPREC* sourceCpp_1_hh(SEXP, SEXP, SEXP)'

你对这个问题有什么想法吗?

先感谢您!

4

1 回答 1

2

让我们放慢速度并清理一下,下面是其他示例:

  1. 永远不要同时包含Rcpp.hRcppArmadillo.h。它错误。并RcppArmadillo.hRcpp.h正确的时间为您服务。(这对生成的代码很重要。)

  2. RNGScope除非您真的知道自己在做什么,否则无需乱七八糟。

  3. 我建议不要扁平化命名空间。

  4. 出于其他地方详细讨论的原因,您可能需要 R 的 RNG。

  5. 该代码未按发布的方式编译:C++//用于注释,而不是#.

  6. 该代码未按发布的方式编译:犰狳使用不同的矩阵创建。

  7. 代码没有按预期运行,因为size()这不是您想要的。我们也不让“零元素”矩阵进入——这可能是对我们的限制。

也就是说,一旦修复,我们现在可以为稍微改变的规范获得正确的行为:

输出
R> Rcpp::sourceCpp("~/git/stackoverflow/63984142/answer.cpp")

R> hh(2, 2)
         [,1]     [,2]
[1,] 0.359028 0.775823
[2,] 0.645632 0.563647
R> 
代码
#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::mat hh(int n, int m) {
  arma::mat Z = arma::mat(n,m,arma::fill::randu);
  return Z;
}

/*** R
hh(2, 2)
*/
于 2020-09-20T22:29:58.757 回答