ตัวอย่างของ RcppArmadillo () คลุมเครือหลังจากอัพเดต R


9

ฉันมักจะทำงานกับฟังก์ชั่น 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()คลุมเครือ ทุกคนสามารถให้ความกระจ่างแก่ฉันได้หรือไม่ว่าทำไมในกรณีนี้

คำตอบ:


9

มีสองสิ่งที่เกิดขึ้นที่นี่และสองส่วนกับปัญหาของคุณและด้วยเหตุนี้คำตอบ

ที่แรกก็คือ "เมตา": ทำไมตอนนี้ ? เรามีข้อผิดพลาดในsample()รหัส / การตั้งค่าซึ่งคริสเตียนได้รับการแก้ไขสำหรับการปล่อย RcppArmadillo ครั้งล่าสุด (และมีการบันทึกไว้ทั้งหมด) ในระยะสั้นอินเตอร์เฟซสำหรับอาร์กิวเมนต์น่าจะมากปัญหาให้คุณที่นี่ก็เปลี่ยนเป็นมันไม่ได้ปลอดภัยสำหรับการกลับมาใช้การใช้งาน / ซ้ำแล้วซ้ำอีก มันคือตอนนี้

ประการที่สองข้อผิดพลาด คุณไม่ได้บอกว่าคอมไพเลอร์หรือเวอร์ชั่นใดที่คุณใช้ แต่ของฉัน (ในปัจจุบันg++-9.3) มีประโยชน์มากสำหรับข้อผิดพลาด มันยังคงเป็นภาษาซีพลัสพลัสดังนั้นจึงจำเป็นต้องมีการเต้นรำเชิงตีความ แต่ในสาระสำคัญมันชัดเจนว่าคุณเรียกด้วยRcpp::Matrix<14>::Rowและไม่มีอินเทอร์เฟซสำหรับประเภทนั้น ซึ่งถูกต้อง sample()มีอินเทอร์เฟซน้อย แต่ไม่มีสำหรับRowวัตถุ ดังนั้นการแก้ไขจึงง่ายอีกครั้ง เพิ่มบรรทัดเพื่อช่วยคอมไพเลอร์โดยทำให้แถว a 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> 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.