我想在 R 包内的 C++ 函数中使用
std::stack
。考虑以下示例 C++ 文件:
// [[Rcpp::plugins(cpp20)]]
#include <Rcpp.h>
#include <stack>
// [[Rcpp::export]]
Rcpp::XPtr<std::stack<int> > stack_c(Rcpp::IntegerVector& v) {
std::stack<int>* s = new std::stack<int>;
s->push(v[0]);
Rcpp::XPtr<std::stack<int> > p(s);
return p;
}
使用
Rcpp::sourceCpp()
在 R 包之外编译它是可行的。但是,它在 R 包中不起作用。
R 包包含上述 C++ 文件和一个 Makevars 文件,其 src 目录中包含
CXX_STD = CXX20
行。
R目录下的R文件调用该函数。
#' @export
stack_r <- function(x) {
return(stack_c(x))
}
NAMESPACE 文件包含常用的 Rcpp 行。
useDynLib(testpkg, .registration=TRUE)
importFrom(Rcpp, evalCpp)
exportPattern("^[[:alpha:]]+")
描述文件导入并链接到 Rcpp。
Imports: Rcpp (>= 1.0.13)
LinkingTo: Rcpp
尝试安装该软件包时,出现以下编译器错误:
RcppExports.cpp:14:18: error: 'stack' is not a member of 'std'
14 | Rcpp::XPtr< std::stack<int> > create_stack(Rcpp::IntegerVector& v);
| ^~~~~
RcppExports.cpp:5:1: note: 'std::stack' is defined in header '<stack>'; did you forget to '#include <stack>'?
我不知道为什么会出现这种情况。 C++ 文件清楚地包含行
#include <stack>
.
我需要设置其他编译器标志吗?
我使用带有最新 Rtools、R 和 Rcpp 版本的 Windows 11。
您编写的 C++ 文件具有正确的标头。 但是由
Rcpp
生成的C++文件,即RcppExports.cpp
,还不知道附加头。 要提供该信息,您可以使用具有特殊名称的文件,如“生成代码中的类型”部分的相应小插图中详细描述的。一种解决方案是 inst/include/testpkg_types.h
,因为您的包裹称为 testpkg
。一个更简单的快捷方式是不在返回类型中使用 std::stack
而是简单地使用
SEXP
。