gpt4 book ai didi

r - 使用 R/Rcpp 在连续索引处切片字符串?

转载 作者:行者123 更新时间:2023-12-04 05:11:31 25 4
gpt4 key购买 nike

我想编写一个函数,在给定的索引处按顺序将“字符串”切片成向量。我有一个相当合适的 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”按照我的意愿行事?)

最佳答案

我会用 substring .像这样的东西:

strslice <- function( x, n ){   
starts <- seq( 1L, nchar(x), by = n )
substring( x, starts, starts + n-1L )
}
strslice( "abcdef", 2 )
# [1] "ab" "cd" "ef"

关于您的 Rcpp代码,也许你可以分配 std::vector<std::string>使用正确的大小,这样你就可以避免调整它的大小,这可能意味着内存分配,...或者直接使用 Rcpp::CharacterVector .像这样的东西:
strslice_rcpp <- rcpp( signature(x="character", n="integer"), '
std::string myString = as<std::string>(x);
int cutpoint = as<int>(n);
int len = myString.length();
int nout = len / cutpoint ;
CharacterVector out( nout ) ;
for( int i=0; i<nout; i++ ) {
out[i] = myString.substr( cutpoint*i, 2 ) ;
}
return out ;
')
strslice_rcpp( "abdcefg", 2 )
# [1] "ab" "cd" "ef"

关于r - 使用 R/Rcpp 在连续索引处切片字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13319858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com