正在使用Rcpp生成包,生成的.h文件缺少头
我目前正在RStudio中构建一个使用Rcpp的包。我已经定义了以下.cpp文件,它与正在使用Rcpp生成包,生成的.h文件缺少头,r,rcpp,R,Rcpp,我目前正在RStudio中构建一个使用Rcpp的包。我已经定义了以下.cpp文件,它与Rcpp::sourceCpp一起工作 // [[Rcpp::plugins(cpp11)]] // [[Rcpp::interfaces(r, cpp)]] #include <Rcpp.h> #include <unordered_set> using namespace Rcpp; // [[Rcpp::export]] std::unordered_set<int>
Rcpp::sourceCpp
一起工作
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::interfaces(r, cpp)]]
#include <Rcpp.h>
#include <unordered_set>
using namespace Rcpp;
// [[Rcpp::export]]
std::unordered_set<int> traverse_cor(NumericMatrix x, float maxcor) {
std::unordered_set<int> elements;
int ncol = x.ncol();
for(int i = 0; i < ncol; i++) {
for(int j = 0; j < ncol; j++) {
if(i < j) {
if(x(i, j) > maxcor && x(i, j) < 1){
elements.insert(i + 1);
}
}
}
}
return elements;
}
尝试构建并重新加载包后,我收到以下错误(1):
../inst/include/gwasim\u RcppExports.h:27:12:错误:中的“无序”设置
命名空间“std”未命名类型
及(二)
RcppExports.cpp:12:1:错误:命名空间“std”中的“无序集”不存在
不命名类型
<>我的C++经验有限,但我的意思是这些错误是由于<代码> >包含被省略而发生的。如何使这些自动生成的文件具有正确的标题
我的sessionInfo如下所示:
Session info ----------------------------------------------------------------------
setting value
version R version 3.1.0 (2014-04-10)
system x86_64, mingw32
ui RStudio (0.99.235)
language (EN)
collate English_United States.1252
tz America/New_York
Packages --------------------------------------------------------------------------
package * version date source
devtools 1.7.0.9000 2015-02-11 Github (hadley/devtools@9415a8a)
digest * 0.6.4 2013-12-03 CRAN (R 3.1.0)
memoise * 0.2.1 2014-04-22 CRAN (R 3.1.0)
mvtnorm 1.0-2 2014-12-18 CRAN (R 3.1.2)
Rcpp 0.11.4 2015-01-24 CRAN (R 3.1.2)
roxygen2 * 4.1.0 2014-12-13 CRAN (R 3.1.2)
rstudioapi * 0.2 2014-12-31 CRAN (R 3.1.2)
stringr * 0.6.2 2012-12-06 CRAN (R 3.0.0)
我的g++版本是4.6.3,包含在Windows的RTools包中。我已通过以下功能启用了C++11功能:
Sys.setenv(“PKG\u cxflags”=“-std=c++0x”)
那是个挑剔的问题。我认为您需要小插曲的第3.5.2节和以下技巧:
Package.h
文件除了包含
Package\u RcppExports.h
标题。这样做是为了使包
作者可以用自定义标题替换Package.h
标题
并且仍然能够包括自动生成的导出
(有关此操作的详细信息将在下一节中提供)
顺便说一下,我想我也说服了您创建一个包,而不是仅仅依赖sourceCpp()
:)
编辑:Doh!!我忽略了那部分
std::unordered_set<int> traverse_cor(NumericMatrix x, float maxcor)
std::无序集遍历(数值矩阵x,浮点最大值)
可能不是一个自动包装的函数。您可能需要将集合转换为向量(或列表或…),以获得一种与R自然匹配的类型。这是一种挑剔的类型。我认为您需要小插曲的第3.5.2节和以下技巧:
Package.h
文件除了包含
Package\u RcppExports.h
标题。这样做是为了使包
作者可以用自定义标题替换Package.h
标题
并且仍然能够包括自动生成的导出
(有关此操作的详细信息将在下一节中提供)
顺便说一下,我想我也说服了您创建一个包,而不是仅仅依赖sourceCpp()
:)
编辑:Doh!!我忽略了那部分
std::unordered_set<int> traverse_cor(NumericMatrix x, float maxcor)
std::无序集遍历(数值矩阵x,浮点最大值)
可能不是一个自动包装的函数。您可能需要将集合转换为向量(或列表或…),以获得与R自然匹配的类型之一。好的,我尝试了这个技巧。我做了以下操作:1)编辑Package.h头,使其具有
#include
,并删除了顶部的标记;2)尝试构建并重新加载包。似乎已经消除了RcppExports.cpp的错误,但我仍然得到了。/inst/include/gwassim\u RcppExports.h:27:12:error:namespace“std”中的“unordered\u set”没有命名类型
看起来我需要更改Package.h文件中标题的顺序。这样做之后,我现在收到一个不同的错误,原来的错误消失了:include/Rcpp/internal/Exporter.h:31:31:错误:从'SEXP'到'long-long unsigned int'[-fppermissive]
的转换无效,因为最简单的修复方法是在包中启用C++11支持。我相信我就是用Sys.setenv(“PKG_cxflags”)来实现的=“-std=c++0x”)
,我在尝试构建包之前运行它。简单地说,我会在src/Makevars
中添加CXX\u STD=cx11
。好的,我尝试了这个技巧。我做了以下操作:1)编辑包.h头,使其包含,并删除顶部的标记,2)尝试构建并重新加载包。看起来get消除了RcppExports.cpp的错误,但我仍然得到了。/inst/include/gwassim\u RcppExports.h:27:12:error:namespace“std”中的“unordered\u set”没有命名类型
看起来我需要更改Package.h文件中标题的顺序。执行此操作后,我现在收到一个不同的错误,原来的错误消失了:include/Rcpp/internal/Exporter.h:31:31:错误:从'SEXP'到'long-long unsigned int'[-fppermissive]
的转换无效,因为最简单的修复方法是在包中打开C++11支持。我相信我正是通过Sys.setenv(“PKG_cxflags”=“-std=C++0x”)来实现这一点的
,我在尝试构建包之前运行它。简单地说,我将在src/Makevars
中添加CXX\u STD=cx11
。