RcppArmadillo'nun örneği (), R güncelleştirildikten sonra belirsiz


9

Ben genellikle her satır 1 toplam K olasılıkları içeren bir matris girdi olarak alır kısa bir Rcpp fonksiyonu ile çalışır. Fonksiyon daha sonra rastgele her satır için sağlanan olasılıklara karşılık gelen 1 ve K arasında bir tamsayı örnekler. Bu işlev:

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

Yakın zamanda R ve tüm paketleri güncelledim. Artık bu işlevi derleyemiyorum. Sebebi benim için net değil. Koşu

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

aşağıdaki hatayı atar:

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

Bu temelde bana RcppArmadillo::sample()çağrımın belirsiz olduğunu söylüyor . Biri beni neden böyle olduğu konusunda aydınlatabilir mi?

Yanıtlar:


9

Burada iki şey oluyor ve probleminizin iki kısmı ve dolayısıyla cevabı var.

Birincisi "meta": neden şimdi ? Peki biz sample()Christian en son RcppArmadillo sürümü için sabit kod / kurulum izin bir hata vardı (ve hepsi orada belgelenmiştir). Kısacası, burada sorun yaratan çok olasılık argümanı için arayüz , yeniden kullanım / tekrarlanan kullanım için güvenli olmadığı için değiştirildi . Şimdi.

İkincisi, hata mesajı. Hangi derleyiciyi veya sürümü kullandığınızı söylemediniz, ancak benimkisi (şu anda g++-9.3) aslında hatayla oldukça yardımcı oluyor. Hala C ++ 'dır, bu yüzden bazı yorumlayıcı danslara ihtiyaç vardır, ancak özünde aradığınız açıkça belirtilir Rcpp::Matrix<14>::Rowve bu tip için herhangi bir arayüz sağlanmaz. Hangisi doğru. sample()birkaç arayüz sunar, ancak bir Rownesne için hiçbiri yoktur . Yani düzeltme bir kez daha basit. Satırı a yaparak derleyiciye yardımcı olmak için bir satır ekleyin NumericVectorve her şey yolunda.

Sabit kod

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

Misal

R> Rcpp::sourceCpp("answer.cpp")        # no need for library(Rcpp)   
R> 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.