在 R 中使用 RcppArmadillo 包和 rowvec 时出现编译错误

Posted

技术标签:

【中文标题】在 R 中使用 RcppArmadillo 包和 rowvec 时出现编译错误【英文标题】:Compilation Error using RcppArmadillo package in R with rowvec 【发布时间】:2019-07-24 15:38:24 【问题描述】:

我正在尝试编译以下代码。请参阅下面我到目前为止所尝试的内容。有什么我想念的吗。任何帮助,将不胜感激。

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;

// [[Rcpp::export]]
List beta(const arma::rowvec beta,
          const int n, 
          const int L1,
          const int p,
          const arma::mat YWeight1,
          const arma::mat z)

    double S0=0;

    for(int i = 0;i < n; ++i)
        arma::rowvec zr = z.rows(i,i);
        S0 +=  exp(arma::as_scalar(beta*zr.t()));
    

    List res;
    res["1"] = S0;
    return(res);

我无法复制错误,但这就是我得到的。

no match for call to '(Rcpp::traits::input_parameter<const arma::Row<double> 

等等……

【问题讨论】:

感谢您的快速回复。更改后我仍然收到相同的错误。我还将 beta 更改为 beta.t() 只是为了使其与 S0 += 兼容。 【参考方案1】:

一个rowvec 转换器。这里的问题是:

filece5923f317b2.cpp:39:34: 错误: type 'Rcpp::traits::input_parameter::type' (aka 'ConstInputParameter >') 不提供调用操作符 rcpp_result_gen = Rcpp::wrap(beta(beta, n, L1, p, YWeight1, z));

几个想法:1. 已经有一个名为 beta() 的函数,2. 有一个名为 beta 的变量,它可能会对 Rcpp 属性造成严重破坏。

解决办法:

删除using namespace Rcpp; 将函数从 beta() 重命名为 beta_estimator()。 指定Rcpp::List的长度 通过数字索引而不是字符串访问。

更正代码:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
Rcpp::List beta_estimator( // renamed function
          const arma::rowvec beta,
          const int n, 
          const int L1,
          const int p,
          const arma::mat YWeight1,
          const arma::mat z)

    double S0 = 0;

    for(int i = 0;i < n; ++i)
        arma::rowvec zr = z.rows(i,i);
        S0 += exp(arma::as_scalar(beta*zr.t()));
    

    // Specify list length
    Rcpp::List res(1);
    res[0] = S0;
    return(res);

【讨论】:

效果很好。谢谢你的帮助。我对 C++ 很陌生。我正在尝试用 C++ 编写我的 R 代码以提高效率。 还有一个问题。在上面的代码中,我只是在 for 循环之后添加 arma::mat S1(p,1) 。然后我有 Rcpp::List res(2);资源[0]=S0;资源[1]=S1;返回(资源);。我收到一个错误,即 S1 未在此范围内声明。 S1 没有在上面给出的函数中定义。仅定义了 S0。在循环外添加类似于double S0 = 0; 的行定义它应该没问题。 知道了。谢谢你的帮助。

以上是关于在 R 中使用 RcppArmadillo 包和 rowvec 时出现编译错误的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中安装 RcppArmadillo

错误:R 3.5.3上的程序包RcppArmadillo的延迟加载失败

如何在 Windows 上为旧 R 匹配 Rcpp 和 RcppArmadillo 的版本?

/usr/bin/ld: 在 R 中安装“RcppArmadillo”时找不到 -lgfortran

RcppArmadillo:对角矩阵乘法很慢

RcppArmadillo: arma::cube 的向量