Chcę napisać funkcję, która wycina "ciąg" w wektorze, sekwencyjnie, w danym indeksie. Mam dla niego dość odpowiednie rozwiązanie R; jednak myślę, że napisanie kodu w C/C++ byłoby prawdopodobnie szybsze. Na przykład, chciałbym, aby móc napisać funkcję „strslice”, który działa w następujący sposób:Wyciąć łańcuch w kolejnych indeksach za pomocą R/Rcpp?
x <- "abcdef"
strslice(x, 2) ## should return c("ab", "cd", "ef")
Jednak nie jestem pewien, jak obsługiwać traktując elementy „CharacterVector” przeszedł w okolice Kod Rcpp jako ciągi. To jest to, co ja sobie wyobrazić, może działać (biorąc pod uwagę mój brak C++/wiedzy RCPP Jestem pewien, że istnieje lepszy sposób):
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);
')
Dla przypomnienia, odpowiedni kod R mam to:
strslice <- function(x, n) {
x <- as.data.frame(stringsAsFactors=FALSE,
matrix(unlist(strsplit(x, "")), ncol=n, byrow=T)
)
do.call(function(...) { paste(..., sep="") }, x)
}
... ale myślę, że przeskakiwanie pomiędzy strukturami danych tak bardzo spowalnia rzeczy z bardzo dużymi łańcuchami.
(alternatywnie: czy istnieje sposób, aby zmusić „strsplit” zachowuje się jak chcę?)
Powinieneś prawdopodobnie spojrzeć na pakiet Biostrings. –