Bir dizgiyi bir diziye sıralı olarak bir dizine bölen bir işlev yazmak istiyorum. Bunun için oldukça uygun bir R çözümüm var; Ancak, C/C++ kodunun yazılmasının daha hızlı olacağına inanıyorum.R/Rcpp ile ardışık göstergelerdeki bir dizgiyi dilimleyin?
x <- "abcdef"
strslice(x, 2) ## should return c("ab", "cd", "ef")
Ancak etrafında geçti 'CharacterVector' işlnem elemanlarını nasıl ele emin değilim, şu şekildedir: Örneğin, ben çalışan bir işlev 'strslice' yazabilmek istiyorum Rcpp kod dizeleri olarak. Bu benim (Ben daha iyi bir yaklaşım olduğuna eminim C++/Rcpp benim bilgi eksikliği verilen) çalışır olabileceğini hayal şudur:
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);
')
kayda geçsin sahip karşılık gelen R kodudur:
strslice <- function(x, n) {
x <- as.data.frame(stringsAsFactors=FALSE,
matrix(unlist(strsplit(x, "")), ncol=n, byrow=T)
)
do.call(function(...) { paste(..., sep="") }, x)
}
... ama veri yapıları arasında dolaşmayı çok çok çok büyük iplerle yavaşlatır.
(Alternatif olarak: istediğim gibi davranıyor içine 'strsplit' zorlamak için bir yol var mı?)
Muhtemelen Biostrings paketine bakmalısınız. –