Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert individual Rcpp::IntegerVector element to a character

Tags:

r

rcpp

I have to convert individual elements of Rcpp::IntegerVector into their string form so I can add another string to them. My code looks like this:

   #include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::String int_to_char_single_fun(int x){
  // Obtain environment containing function
  Rcpp::Environment base("package:base");

  // Make function callable from C++
  Rcpp::Function int_to_string = base["as.character"];

  // Call the function and receive its list output
  Rcpp::String res = int_to_string(Rcpp::_["x"] = x); // example of original param

  // Return test object in list structure
  return (res);
}

//[[Rcpp::export]]
Rcpp::CharacterVector add_chars_to_int(Rcpp::IntegerVector x){
  int n = x.size();
  Rcpp::CharacterVector BASEL_SEG(n);
  for(int i = 0; i < n; i++){
  BASEL_SEG[i] = "B0" +  int_to_char_single_fun(x[i]);
  }
  return BASEL_SEG;
}

/*** R
int_vec <- as.integer(c(1,2,3,4,5))
BASEL_SEG_char <- add_chars_to_int(int_vec)
*/

I get the following error:

no match for 'operator+'(operand types are 'const char[3]' and 'Rcpp::String')

I cannot import any C++ libraries like Boost to do this and can only use Rcpp functionality to do this. How do I add string to integer here in Rcpp?

like image 797
Gompu Avatar asked Jun 25 '26 02:06

Gompu


1 Answers

As others have pointed out, there are several ways to do this. Here are two very straightforward approaches.

1. std::to_string

Rcpp::CharacterVector add_chars_to_int1(Rcpp::IntegerVector x){
    int n = x.size();
    Rcpp::CharacterVector BASEL_SEG(n);
    for(int i = 0; i < n; i++){
        BASEL_SEG[i] = "B0" +  std::to_string(x[i]);
    }
    return BASEL_SEG;
}

2. Creating a new Rcpp::CharacterVector

Rcpp::CharacterVector add_chars_to_int2(Rcpp::IntegerVector x){
    int n = x.size();
    Rcpp::CharacterVector BASEL_SEG(n);
    Rcpp::CharacterVector myIntToStr(x.begin(), x.end());
    for(int i = 0; i < n; i++){
        BASEL_SEG[i] = "B0" +  myIntToStr[i];
    }
    return BASEL_SEG;
}

Calling them:

add_chars_to_int1(int_vec) ## using std::to_string
[1] "B01" "B02" "B03" "B04" "B05"

add_chars_to_int2(int_vec) ## converting to CharacterVector
[1] "B01" "B02" "B03" "B04" "B05"
like image 160
Joseph Wood Avatar answered Jun 26 '26 19:06

Joseph Wood



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!