Rcpp代码在Mac上编译但在linux

时间:2018-04-03 19:17:51

标签: r rcpp

我的C ++代码是接受一个字符向量并将其转换为std :: set。以下代码在Mac上编译,但在Linux上编译:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
void test(CharacterVector x) {
  std::set<std::string> vs(x.begin(), x.end());
}

Linux编译失败:

/usr/include/c++/4.8.2/bits/stl_function.h:481:7: note:   no known conversion for argument 1 from ‘Rcpp::internal::string_proxy<16>’ to ‘const std::basic_string<char>&’

Mac信息:

R版本3.4.1(2017-06-30) 平台:x86_64-apple-darwin15.6.0(64位) 运行于:macOS High Sierra 10.13.3 Rcpp_0.12.16

Linux信息:

R版本3.4.2(2017-09-28) 平台:x86_64-redhat-linux-gnu(64位) 运行于:CentOS Linux 7(核心) Rcpp_0.12.16

作为一种解决方法,我可以先将字符向量转换为std :: vector,然后将std :: vector转换为std :: set。但是,在我的测试中,这会导致约5-10%的性能损失,我想避免。

这是一个错误吗?我如何在linux上正确地完成它?

1 个答案:

答案 0 :(得分:1)

此变体适用于Ubuntu 17.10上的g ++ 7.2:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
void test(std::vector<std::string> x) {
  std::set<std::string> vs(x.begin(), x.end());
}

并且运行(但什么都不做)

R> Rcpp::sourceCpp("/tmp/soQ.cpp")
R> test(rep("lalala", 3))
R> 

字符向量很复杂;迭代器可能还有一些不太理想的东西。欢迎小心的PR;与此同时,你有一个简单的选择。