RcppExport中的错误原因

Cause of error in RcppExport

本文关键字:错误 RcppExport      更新时间:2023-10-16

在我正在RStudio中编辑的.cpp文件中,以下代码

// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
mat mkGramMatrix (mat X, int n, double (*kernel) (mat, mat, double), double k_param=0){
  double (*func_kernel) (mat, mat, double);
  func_kernel = kernel;
  mat K(n, n);
  for (int i = 0; i < n; i++){
    for (int j = 0; j < n; j++){
      K(i, j) = func_kernel(X.row(i), X.row(j), k_param);
    }
  }
  return K;
}

当我尝试在 RStudio 内部源代码时产生以下错误:

KFDA_Rcpp.cpp:138:63: error: cannot combine with previous 'type-name' declaration specifier
RcppExport SEXP sourceCpp_32_mkGramMatrix(SEXP XSEXP, SEXP nSEXP, SEXP double)SEXP, SEXP k_paramSEXP) {
                                                                       ^
KFDA_Rcpp.cpp:138:70: error: expected ';' after top level declarator
RcppExport SEXP sourceCpp_32_mkGramMatrix(SEXP XSEXP, SEXP nSEXP, SEXP double)SEXP, SEXP k_paramSEXP) {
                                                                              ^
                                                                              ;
KFDA_Rcpp.cpp:138:74: error: expected unqualified-id
RcppExport SEXP sourceCpp_32_mkGramMatrix(SEXP XSEXP, SEXP nSEXP, SEXP double)SEXP, SEXP k_paramSEXP) {
                                                                                  ^
3 errors generated.

为什么要在右括号中放置

SEXP double)SEXP

当我相信我正确使用了函数指针时?我已经成功编译并使用了其他 RcppArmadillo 函数,没有问题,但这是我制作的第一个利用函数指针的函数,因此我可以在调用此函数时指定内核。

您不能在接口中放置函数指针,因为它不是映射到SEXP的类型。

我们只能从 R 调用映射到.Call()接口的函数,该接口需要SEXP参数---因此我们可以使用具有映射器的类型SEXP

最简单的方法是使用 Rcpp::XPtr .它提供了一个"外部指针接口",您可以通过该接口传递内核函数。在 mkGramMatrix() 函数中,您可以将XPtr取消引用为要调用的函数。这里有几篇帖子 和 Rcpp 画廊 可以帮助您入门。 这是一个很棒的机制:坚持下去并阅读它。