RcppArmadillo 的 sample() 在更新 R 后不明确

标签 r rcpp rcpparmadillo

我通常使用一个简短的 Rcpp 函数,该函数将一个矩阵作为输入,其中每一行包含 K 个总和为 1 的概率。然后,该函数为每一行随机采样一个 1 到 K 之间的整数,对应于提供的概率。这是功能:

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

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) {
  int n = x.nrow();
  IntegerVector result(n);
  for ( int i = 0; i < n; ++i ) {
    result[i] = RcppArmadillo::sample(choice_set, 1, false, x(i, _))[0];
  }
  return result;
}

我最近更新了 R 和所有软件包。现在我不能再编译这个函数了。我不清楚原因。运行
library(Rcpp)
library(RcppArmadillo)
Rcpp::sourceCpp("sample_matrix.cpp")

引发以下错误:
error: call of overloaded 'sample(Rcpp::IntegerVector&, int, bool, Rcpp::Matrix<14>::Row)' is ambiguous

这基本上告诉我,我调用 RcppArmadillo::sample()是模棱两可的。谁能告诉我为什么会这样?

最佳答案

这里发生了两件事,以及您的问题的两个部分,因此是答案。

首先是“元”:为什么是现在?好吧,我们在 sample() 中有一个错误。 Christian 为最新的 RcppArmadillo 版本修复的代码/设置(并且都记录在那里)。简而言之,在这里给您带来麻烦的概率参数的界面已更改,因为重复使用/重复使用不安全。就是现在。

第二,错误信息。您没有说您使用的编译器或版本,但我的(当前 g++-9.3 )实际上对错误很有帮助。它仍然是 C++,所以需要一些解释性的舞蹈,但本质上它清楚地表明你用 Rcpp::Matrix<14>::Row 调用。并且没有为该类型提供接口(interface)。哪个是对的。 sample()提供了一些接口(interface),但没有一个 Row目的。因此,修复再次简单。通过将行设为 NumericVector 添加一行来帮助编译器一切都很好。

固定代码

#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>

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

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) {
  int n = x.nrow();
  IntegerVector result(n);
  for ( int i = 0; i < n; ++i ) {
    Rcpp::NumericVector z(x(i, _));
    result[i] = RcppArmadillo::sample(choice_set, 1, false, z)[0];
  }
  return result;
}

例子
R> Rcpp::sourceCpp("answer.cpp")        # no need for library(Rcpp)   
R> 

关于RcppArmadillo 的 sample() 在更新 R 后不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59354977/

相关文章:

c++ - 在 Rcpp (Armadillo) 函数中使用数字序列作为默认参数

r - 在 R 上具有两个不同变量的条形图

c++ - Rcpparmadillo C++ 创建 bool vector

r - 如何通过 Rcurl 使用 cookie 下载文件

c++ - Rcpp - 在包结构之外编译

r - 在 Rcpp 中创建 R S4 类的对象?

c++ - 如何使用Rcpp使执行就地操作的C++函数可用于另一个R包?

r - Rcpp中bool向量的子集向量

r - xts tick 数据滚动子集

r - 如何使用 ggplot2 绘制 FDA 对象?