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

मैंने हाल ही में आर और सभी पैकेजों को अपडेट किया है। अब मैं इस फ़ंक्शन को संकलित नहीं कर सकता। कारण मेरे लिए स्पष्ट नहीं है। चल रहा है

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) वास्तव में त्रुटि के साथ बहुत उपयोगी है। यह अभी भी C ++ है इसलिए कुछ व्याख्यात्मक नृत्य की आवश्यकता है लेकिन संक्षेप में यह स्पष्ट रूप से आपके साथ बुलाया गया है Rcpp::Matrix<14>::Rowऔर उस प्रकार के लिए कोई इंटरफ़ेस प्रदान नहीं किया गया है। क्या सही है। sample()कुछ इंटरफ़ेस प्रदान करता है, लेकिन 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> 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.