Ich möchte eine Funktion schreiben, die eine 'Zeichenfolge' nacheinander in einen Vektor schneidet. Ich habe eine ziemlich angemessene R-Lösung dafür; Ich denke jedoch, dass das Schreiben des Codes in C/C++ wahrscheinlich schneller wäre. Zum Beispiel würde Ich mag Lage sein, eine Funktion ‚strslice‘ zu schreiben, die wie folgt funktioniert:Slice eine Zeichenfolge bei aufeinanderfolgenden Indizes mit R/Rcpp?
x <- "abcdef"
strslice(x, 2) ## should return c("ab", "cd", "ef")
Allerdings bin ich mir nicht sicher, wie Behandlungselemente des ‚CharacterVector‘ in der herumgereicht zu handhaben Rcpp-Code als Zeichenfolgen. Dies ist, was sich vorstellen könnte ich (meinen Mangel an C++/RCPP Wissen Ich bin sicher, dass es ein besserer Ansatz) Arbeit:
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);
')
Für die Aufzeichnung der entsprechenden R-Code ich habe, ist:
strslice <- function(x, n) {
x <- as.data.frame(stringsAsFactors=FALSE,
matrix(unlist(strsplit(x, "")), ncol=n, byrow=T)
)
do.call(function(...) { paste(..., sep="") }, x)
}
... aber ich denke, zwischen Datenstrukturen herumzuspringen, wird vieles mit sehr großen Strings verlangsamen.
(Alternativ: Gibt es eine Möglichkeit ‚strsplit‘ in Verhalten zu zwingen, wie ich will?)
Sie sollten sich wahrscheinlich das Biostrings-Paket ansehen. –