Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cout NumericVectors?

Tags:

c++

r

rcpp

I'm quite new to programming with Rcpp so I'm trying out new things to see how everything works. I wrote a small programm to compare two NumericVectors with the match() function. I also wanted to print out the input Vectors and the Output but it doesn't seem to work since I don't get the entries of the Vectors back but the storage place (or something like that). I haven't found any kind of "print" function for NumericVectors but maybe there's another way? Any help will be appreciated.

This is my code:

#include <Rcpp.h>
using namespace Rcpp;
using namespace std;
// [[Rcpp::export]]
IntegerVector vergl(NumericVector eins, NumericVector zwei){
 IntegerVector out = match(eins, zwei);
 cout << eins << endl;
 cout << zwei << endl;
 cout << match(eins, zwei) << endl;
 return out;
 }

A small example:

vergl(c(1,2,3),c(2,3,4))

The output:

> vergl(c(1,2,3),c(2,3,4))
0xa1923c0
0xa192408
0xb6d7038
[1] NA  1  2

Thank you.

like image 799
rgum Avatar asked Feb 12 '23 08:02

rgum


2 Answers

Read gallery.rcpp.org/articles/using-rcout .

#include <RcppArmadillo.h>   

// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector vergl(NumericVector eins, NumericVector zwei){
 IntegerVector out = match(eins, zwei);
 Rcout << as<arma::rowvec>(eins) << std::endl;
 Rcout << as<arma::rowvec>(zwei) << std::endl;
 Rcout << as<arma::rowvec>(out) << std::endl;
 return out;
}

In R:

vergl(c(1,2,3),c(2,3,4))
#   1.0000   2.0000   3.0000
#
#   2.0000   3.0000   4.0000
#
#      nan   1.0000   2.0000
#
#[1] NA  1  2
like image 70
Roland Avatar answered Feb 13 '23 20:02

Roland


Try this Rf_PrintValue(eins); or Function print("print"); print(eins); or similar as shown in the display function in the example.

For example, assuming this is in Rf_PrintValue.cpp:

#include <Rcpp.h>
using namespace Rcpp;
using namespace std;

// [[Rcpp::export]]
IntegerVector vergl(NumericVector eins, NumericVector zwei) {

 IntegerVector out = match(eins, zwei);

 Rf_PrintValue(eins);
 Rf_PrintValue(zwei);
 Rf_PrintValue(match(eins, zwei));

 Function print("print");
 print(out);

 Function display("display");
 display("out", out);

 return out;
}

/*** R
display <- function(name, x) { cat(name, ":\n", sep = ""); print(x) }
vergl(c(1,2,3),c(2,3,4))
*/

we can run it like this. The first three output vectors come from the Rf_PrintValue statements, the fourth from the print statement and the fifth is from the display function and the last is the output of the verg1 function:

> library(Rcpp)
> sourceCpp("Rf_PrintValue.cpp")

> display <- function(name, x) { cat(name, ":\n", sep = ""); print(x) }

> vergl(c(1,2,3),c(2,3,4))
[1] 1 2 3
[1] 2 3 4
[1] NA  1  2
[1] NA  1  2
out:
[1] NA  1  2
[1] NA  1  2

Revised Changed the second solution and added an example. Also added display to example.

like image 28
G. Grothendieck Avatar answered Feb 13 '23 21:02

G. Grothendieck