我是C++編程的新手,嘗試通過R來試驗Rcpp。 我創建了一個函數來從字符串中產生所有可能的k-mers。它的工作原理以及在它的串行形式:未定義引用自定義函數(C++和RcppParallel)
#include <Rcpp.h>
#include <string>
#include <iostream>
#include <ctime>
// using namespace Rcpp;
// [[Rcpp::export]]
std::vector<std::string> cpp_kmer(std::string s, int k){
std::vector<std::string> kmers;
int seq_loop_size = s.length() - k+1;
for (int z=0; z < seq_loop_size; z++) {
std::string kmer;
kmer = s.substr(z, k);
kmers.push_back(kmer) ;
}
return kmers;
}
然而,當我嘗試在並行實現使用此功能(使用RcppParallel),用下面的代碼:
#include <Rcpp.h>
#include <string>
#include <iostream>
#include <ctime>
using namespace Rcpp;
// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
using namespace RcppParallel;
struct p_cpp_kmer : public Worker {
// input string
std::vector<std::string> seqs;
int k;
std::vector<std::string> cpp_kmer(std::string s, int k);
// destination list
List output;
std::string
sub_s;
// initialize with source and destination
p_cpp_kmer(std::vector<std::string> seqs, int k, List output)
: seqs(seqs), k(k), output(output) {}
// calculate k-mers for the range of sequences requested
void operator()(std::size_t begin, std::size_t end) {
for (std::size_t i = begin; i < end; i++)
sub_s = seqs[i];
cpp_kmer(sub_s, k);
}
};
// [[Rcpp::export]]
List par_cpp_kmer(std::vector<std::string> seqs, int k, bool v){
// allocate output list
List outpar(num_seqs);
int num_seqs = seqs.size();
// p_cpp_kmer functor (pass input and output matrixes)
p_cpp_kmer par_kmer(seqs, k, outpar);
parallelFor(0, num_seqs, par_kmer);
return wrap(outpar);
}
std::vector<std::string> cpp_kmer(std::string s, int k){
std::vector<std::string> kmers;
int seq_loop_size = s.length() - k+1;
for (int z=0; z < seq_loop_size; z++) {
std::string kmer;
kmer = s.substr(z, k);
kmers.push_back(kmer) ;
}
return kmers;
}
它沒有編譯,給出:未定義的引用p_cpp_kmer :: cpp_kmer(std :: string,int)'錯誤。
我知道它與聲明/引用cpp_kmer有關,但我無法找到適當的地方/如何做(因爲我缺乏C++知識)。
非常感謝您提前。
非常感謝你,你的解決方案看起來很簡單,但是當試圖編譯它時,我收到以下錯誤:'cpp_kmer_par_SO.cpp:10:7:錯誤:'string_vector'之前預期的嵌套名稱說明符' cpp_kmer_par_SO.cpp :10:7:錯誤:'string_vector'尚未聲明 cpp_kmer_par_SO.cpp:10:21:錯誤:預計';'在'='標記之前 和'list_string_vector'聲明的類似錯誤。 我證實我可以使用[Rcpp gallery](http://gallery.rcpp.org/articles/first-steps-with-C++11/)中的示例編譯其他C++ 11代碼。 – IsoBar
關於使代碼「線程安全」,我試圖使用RVector方法,如[這裏](https://rcppcore.github.io/RcppParallel/#safe_accessors)所述,但我不能'找到使用這個結構的字符串而不是數字的任何例子。 –
IsoBar
您使用'expected nested-name-specifier'指定的錯誤表明您可能沒有完整的C++ 11實現。也許你可以使用一些'typedef'來代替。 –