特定のインデックスで、「文字列」をベクトルに順次スライスする関数を書きたいと思います。私はそれにかなり適切なRソリューションを持っています。ただし、C/C++ でコードを記述した方が高速になる可能性が高いと思います。たとえば、次のように動作する関数「strslice」を記述できるようにしたいと考えています。
x <- "abcdef"
strslice( x, 2 ) ## should return c("ab", "cd", "ef")
ただし、Rcpp コードで渡された「CharacterVector」の要素を文字列として処理する方法がわかりません。これはうまくいくと私が想像するものです(C++/Rcppの知識が不足しているため、より良いアプローチがあると確信しています):
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 );
')
記録のために、私が持っている対応する R コードは次のとおりです。
strslice <- function(x, n) {
x <- as.data.frame( stringsAsFactors=FALSE,
matrix( unlist( strsplit( x, "" ) ), ncol=n, byrow=T )
)
do.call( function(...) { paste(..., sep="") }, x )
}
...しかし、データ構造間を飛び回ると、非常に大きな文字列で処理が遅くなると思います。
(または、「strsplit」を強制的に動作させる方法はありますか?)