Je veux écrire une fonction qui découpe une "chaîne" en un vecteur, séquentiellement, à un index donné. J'ai une solution R assez adéquate pour cela ; cependant, je pense qu'écrire le code en C/C++ serait probablement plus rapide. Par exemple, j'aimerais pouvoir écrire une fonction "strslice" qui fonctionne comme suit :
x <- "abcdef"
strslice( x, 2 ) ## should return c("ab", "cd", "ef")
Cependant, je ne sais pas comment traiter les éléments du "CharacterVector" transmis dans le code Rcpp comme des chaînes de caractères. Voici ce que j'imagine pouvoir fonctionner (étant donné mon manque de connaissances en C++/Rcpp, je suis sûr qu'il existe une meilleure approche) :
f <- rcpp( signature(x="character", n="integer"), '
std::string myString = Rcpp::as<std::string>(x);
int cutpoint = Rcpp::as<int>(n);
vector<std::string> outString;
int len = myString.length();
for( int i=0; i<len/n; i=i+n ) {
outString.push_back( myString.substr(i,i+n-1 ) );
myString = myString.substr(i+n, len-i*n);
}
return Rcpp::wrap<Rcpp::CharacterVector>( outString );
')
Pour mémoire, le code R correspondant que j'ai est le suivant :
strslice <- function(x, n) {
x <- as.data.frame( stringsAsFactors=FALSE,
matrix( unlist( strsplit( x, "" ) ), ncol=n, byrow=T )
)
do.call( function(...) { paste(..., sep="") }, x )
}
...mais je pense que sauter autant entre les structures de données ralentira les choses avec de très grandes chaînes.
(Autre possibilité : existe-t-il un moyen de contraindre "strsplit" à se comporter comme je le souhaite ?)