2017-11-14 21 views
1

私は、オーバーラップの短い文字列を比較する方法を探しています。Rcpp関数のヌルバイト文字

lcsメソッドを使用してstringdistパッケージを使用すると合理的な方法が見つかるかもしれないと思っていましたが、別の処理を行っているようです。

この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でラップしようとすると、この文字が許可されていないというエラーが表示されます。

答えて

1

あなたがC++の関数を定義するためにcppFunctionを使用する場合、あなたは\をエスケープする必要があるので、これは、あるあなたがC++のコードで\0を持つようにしたい場合はつまり、あなたがcppFunctionに与える文字列で\\0を記述する必要があります。

あなたが推奨されるものです.cppファイルにあなたの関数を入れた場合、その必要はありません

> overlap("foo", "foooo") 
[1] 3 

注:をあなたに与えます

Rcpp::cppFunction(" 
int overlap(const char* s1, const char* s2){ 

    int i = 0; 
    while (*s1 != '\\0' && *s2 != '\\0') { 
    if (*s1++ == *s2++) i++; 
    } 
    return i; 

}") 
#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; 
}