Rc를 업데이트 한 후 RcppArmadillo의 sample ()이 모호합니다


9

나는 일반적으로 짧은 Rcpp 함수를 사용하여 각 행에 1의 K 확률을 포함하는 행렬을 입력으로 사용합니다.이 함수는 각 확률에 대해 제공된 확률에 해당하는 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()이 모호하다는 것을 말해줍니다 . 왜 이런 경우에 대해 누군가 나를 밝힐 수 있습니까?

답변:


9

여기에는 두 가지 일이 있으며 문제와 두 가지 부분이 있습니다.

첫 번째는 "메타"입니다. 왜 지금 ? 글쎄, 우리는 sample()Christian이 가장 최근의 RcppArmadillo 릴리스를 위해 친절하게 수정 한 코드 / 설정 에 버그가있었습니다 (그리고 모두 문서화되어 있습니다). 간단히 말해서, 여기에서 문제를 일으키는 확률이 매우 높은 인수에 대한 인터페이스 는 재사용 / 반복 사용에 안전하지 않기 때문에 변경 되었습니다 . 지금이야.

둘째, 오류 메시지입니다. 어떤 컴파일러 또는 버전을 사용하는지 말하지 않았지만 g++-9.3실제로 (현재 )는 실제로 오류에 매우 도움이됩니다. 그것은 여전히 ​​C ++이므로 일부 해석 춤이 필요하지만 본질적으로 호출 한 것으로 분명히 말하고 Rcpp::Matrix<14>::Row해당 유형에 대한 인터페이스가 제공되지 않습니다. 어느 것이 맞습니까? sample()몇 가지 인터페이스를 제공하지만 Row객체 에는 없습니다 . 따라서 수정은 간단합니다. 행을 a NumericVector와 all 로 작성하여 컴파일러를 돕기위한 행을 추가하십시오 .

고정 코드

#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> 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.