2

の要素またはイテレータをにRcpp変換する方法があるかどうか疑問に思っています。次のコードを試してみるとconst CharacterVector&std::string

void as(const CharacterVector& src) {
    std::string glue;
for(int i = 0;i < src.size();i++) {
        glue.assign(src[i]);
}
}

コンパイル時エラーが発生します:

no known conversion for argument 1 from ‘const type {aka SEXPREC* const}’ to ‘const char*’

これまでのところ、C API を使用して変換を行います。

glue.assign(CHAR(STRING_ELT(src.asSexp(), i)));

私の Rcpp バージョンは 0.10.2 です。

ちなみに、 があることは知っていRcpp::asます。

glue.assign(Rcpp::as<std::string>(src[i]));

上記のコードは実行時エラーを生成します:

Error: expecting a string

一方、次のコードは正しく実行されます。

typedef std::vector< std::string > StrVec;
StrVec glue( Rcpp::as<StrVec>(src) );

ただし、私の場合、文字列の一時的な長いベクトルを作成したくありません。

回答ありがとうございます。

4

2 に答える 2

1

私はあなたが望むものと混乱しています.CharacterVectorは(Rのように)文字列のベクトルstd::vector<std::string> >であるため、 . これは非常に単純で非常に手動の例です (これには自動変換機能があると思っていましたが、ないかもしれません。または、それ以上ではありません。

#include <Rcpp.h>  

// [[Rcpp::export]] 
std::vector<std::string> ex(Rcpp::CharacterVector f) {  
  std::vector<std::string> s(f.size());   
  for (int i=0; i<f.size(); i++) {  
    s[i] = std::string(f[i]);  
  }  
  return(s);     
}

そして、ここにそれが働いています:

R> sourceCpp("/tmp/strings.cpp")
R> ex(c("The","brown","fox"))  
[1] "The"   "brown" "fox" 
R>
于 2013-03-13T20:00:54.247 に答える
1

Rcpp 0.12.7 では、 を使用できますRcpp::as<std::vector<std::string> >。次の関数は、test配列の 2 番目の要素を返します。

std::string test() {
  Rcpp::CharacterVector test = Rcpp::CharacterVector::create("a", "z");
  std::vector<std::string> test_string = Rcpp::as<std::vector<std::string> >(test);
  return test_string[1];
}
于 2016-11-14T11:49:42.537 に答える