Я хочу написать функцию, которая последовательно нарезает «строку» на вектор по заданному индексу. У меня есть для этого достаточно адекватное решение R; однако я полагаю, что написание кода на C/C++, вероятно, будет быстрее. Например, я хотел бы иметь возможность написать функцию «strslice», которая работает следующим образом:
x <- "abcdef"
strslice( x, 2 ) ## should return c("ab", "cd", "ef")
Однако я не уверен, как обрабатывать элементы «CharacterVector», передаваемые в коде Rcpp, как строки. Это то, что я думаю, может сработать (учитывая отсутствие у меня знаний С++/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» вести себя так, как я хочу?)