Mẫu của RcppArmadillo () không rõ ràng sau khi cập nhật R


9

Tôi thường làm việc với hàm Rcpp ngắn, lấy đầu vào là ma trận trong đó mỗi hàng chứa K xác suất tổng bằng 1. Hàm sau đó lấy mẫu ngẫu nhiên cho mỗi hàng một số nguyên từ 1 đến K tương ứng với xác suất được cung cấp. Đây là chức năng:

// [[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;
}

Gần đây tôi đã cập nhật R và tất cả các gói. Bây giờ tôi không thể biên dịch hàm này nữa. Lý do không rõ ràng với tôi. Đang chạy

library(Rcpp)
library(RcppArmadillo)
Rcpp::sourceCpp("sample_matrix.cpp")

ném lỗi sau:

error: call of overloaded 'sample(Rcpp::IntegerVector&, int, bool, Rcpp::Matrix<14>::Row)' is ambiguous

Điều này về cơ bản cho tôi biết rằng cuộc gọi của tôi RcppArmadillo::sample()là mơ hồ. Bất cứ ai có thể khai sáng cho tôi tại sao đây là trường hợp?

Câu trả lời:


9

Có hai điều xảy ra ở đây, và hai phần cho vấn đề của bạn và từ đó trả lời.

Đầu tiên là "meta": tại sao bây giờ ? Vâng, chúng tôi đã có một lỗi trong sample()mã / thiết lập mà Christian vui lòng sửa cho bản phát hành RcppArmadillo gần đây nhất (và tất cả đều được ghi lại ở đó). Nói tóm lại, giao diện cho đối số rất xác suất gây rắc rối cho bạn ở đây đã được thay đổi vì nó không an toàn cho việc sử dụng lại / sử dụng nhiều lần . Nó bây giờ là.

Thứ hai, thông báo lỗi. Bạn đã không nói trình biên dịch hoặc phiên bản nào bạn sử dụng nhưng hiện tại của tôi g++-9.3thực sự khá hữu ích với lỗi này. Nó vẫn là C ++ nên một số điệu nhảy diễn giải là cần thiết nhưng thực chất nó nói rõ bạn đã gọi Rcpp::Matrix<14>::Rowvà không có giao diện nào được cung cấp cho loại đó. Cái nào đúng sample()cung cấp một vài giao diện, nhưng không có giao diện nào cho một Rowđối tượng. Vì vậy, sửa chữa là, một lần nữa, đơn giản. Thêm một dòng để hỗ trợ trình biên dịch bằng cách tạo một hàng NumericVectorvà tất cả đều tốt.

Mã cố định

#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;
}

Thí dụ

R> Rcpp::sourceCpp("answer.cpp")        # no need for library(Rcpp)   
R> 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.