我正在寻找一种比较重叠短字符串的方法。
我认为我可能会使用stringdist
方法使用lcs
方法找到合理的方法,但它似乎做了不同的事情。
此C标记的stackoverflow问题的已接受答案:
Detecting length of overlap between two strings
int overlap(const char *s1, const char *s2){
int i = 0;
while (*s1 != '\0' && *s2 != '\0') {
if (*s1++ == *s2++) i++;
}
return i;
}
涉及使用nul字节字符来表示空字符串。
我怎么能把它翻译成Rcpp中有用的东西?当我尝试将其包裹在cppFunction
中时,我收到一条错误消息,指出不允许使用此字符。
答案 0 :(得分:1)
这是因为当你使用cppFunction
来定义你的C ++函数时,你需要转义\
,即如果你想在C ++代码中有\0
,你需要在您为\\0
提供的字符串中写下cppFunction
:
Rcpp::cppFunction( "
int overlap(const char* s1, const char* s2){
int i = 0;
while (*s1 != '\\0' && *s2 != '\\0') {
if (*s1++ == *s2++) i++;
}
return i;
}")
这给了你:
> overlap( "foo", "foooo")
[1] 3
请注意,如果将函数放在.cpp文件中,则不需要这样做,这是建议的:
#include <Rcpp.h>
using namespace Rcpp ;
// [[Rcpp::export]]
int overlap(const char* s1, const char* s2 ){
int i = 0;
while (*s1 != '\0' && *s2 != '\0') {
if (*s1++ == *s2++) i++;
}
return i;
}