2015-09-15 15 views
6

के रूप में आरसीपीएआरएमडिलो वेक्टर रिटर्न आरसीपीएआरडिलिलो कोल्वेक को मानक आर वेक्टर के रूप में वापस करने के तरीके को समझने में मुझे परेशानी हो रही है। मैं उम्मीद कर रहा था कि मैं as<NumericVector>(wrap() के माध्यम से टाइपकास्ट कर सकता हूं लेकिन मैं अभी भी आर मैट्रिस वाले ऑब्जेक्ट्स के साथ समाप्त होता हूं। यहाँ दिखाने के लिए मैं क्या कोशिश की है कोड का एक सा (आंशिक रूप से this previous question से प्रेरित) है:आर वेक्टर

// [[Rcpp::export]]                              
List testthis(NumericVector x) { 
    arma::colvec y = x; 
    arma::vec z = x; 

    return List::create(Rcpp::Named("y1")=y, 
         Rcpp::Named("y2")=wrap(y), 
         Rcpp::Named("y3")=as<NumericVector>(wrap(y)), 
         Rcpp::Named("z1")=z, 
         Rcpp::Named("z2")=arma::trans(z), 
         Rcpp::Named("z3")=as<NumericVector>(wrap(z)) 
        ); 
} 

और अगर मैं उत्पादन पर देखने मैं जिसके बाद सभी आर मैट्रिक्स वस्तुओं रहे हैं मिलता है। क्या मैं इसे आर वैक्टर में डाल सकता हूं?

> testthis(c(1:3)) 
$y1 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 

$y2 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 

$y3 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 

$z1 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 

$z2 
    [,1] [,2] [,3] 
[1,] 1 2 3 

$z3 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 

उत्तर

9

तुम बस, NULL करने के लिए dim विशेषता सेट कर सकते हैं के बाद से मैट्रिक्स काफी एक आयामी विशेषता के साथ बस नियमित वैक्टर हैं। सी ++ तरफ से यह इस तरह दिखता है:

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export]] 
Rcpp::List testthis(Rcpp::NumericVector x) { 
    arma::colvec y = x; 
    arma::vec z = x; 

    Rcpp::NumericVector tmp = Rcpp::wrap(y); 
    tmp.attr("dim") = R_NilValue; 

    Rcpp::List result = Rcpp::List::create(
    Rcpp::Named("arma_vec") = y, 
    Rcpp::Named("R_vec") = tmp); 

    return result; 
} 

/*** R 

R> testthis(c(1:3)) 
# $arma_vec 
# [,1] 
# [1,] 1 
# [2,] 2 
# [3,] 3 
# 
# $R_vec 
# [1] 1 2 3 

R> dim(testthis(c(1:3))[[1]]) 
#[1] 3 1 
R> dim(testthis(c(1:3))[[2]]) 
# NULL 

*/ 
+1

यह भी अच्छा है - अच्छा। –

+1

दोनों @ nrussell और Dirk के उत्तरों ने मुझे अपने प्रश्न के साथ मदद की। चूंकि वे थोड़ा अलग (लेकिन मान्य) समाधान प्रदान करते हैं, इसलिए मैंने एक सिक्का फिसल दिया है कि किसको उत्तर क्रेडिट प्राप्त करना चाहिए। धन्यवाद दोनों! – ekstroem

5

यह एक "सुविधा" है। कुछ बिंदु पर हमने बहुत ही आयामों को रखने का फैसला किया, इसलिए वैक्टर हमेशा एक पंक्ति या स्तंभ के साथ मैट्रिस के रूप में वापस आते हैं। चूंकि इस एपीआई को कुछ समय पहले स्थापित किया गया था, अब यह बदलना मुश्किल है क्योंकि हम मौजूदा कोड को तोड़ देंगे।

ऊपर सभी बदलावों को आजमाने के लिए Kudos।

R> cppFunction("std::vector<double> foo(arma::vec v) { 
+        return as<std::vector<double> >(wrap(v)); }", 
+    depends="RcppArmadillo") 
R> foo(c(5.5,6.6,7.42)) 
[1] 5.50 6.60 7.42 
R> 

यह शायद सिर्फ आर तरफ आयाम पट्टी हालांकि अधिक कुशल है: यहाँ एक और है कि std::vector<double> के माध्यम से जा रहा द्वारा मदद करता है।

1

यह एक पुराना सवाल है लेकिन यह विषय की खोज करते समय पहली पंक्तियों में अभी भी पॉप करता है, इसलिए मैं संस्करण 0.7.960.1.0 के बाद से एक और विकल्प साझा करना चाहता हूं। # शामिल और देखा से पहले एक उचित #define सम्मिलित करें:

#define RCPP_ARMADILLO_RETURN_COLVEC_AS_VECTOR 
#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export]] 
arma::vec testthis(arma::vec x) { 
    return x+1; 
} 
/*** R 
testthis(1:3) 
*/ 

> testthis(1:3) 
[1] 2 3 4 

आप ROWVEC या ANYVEC द्वारा #define में COLVEC जगह ले सकता है अगर उचित।