c++ - RcppExport 错误原因

标签 c++ rstudio rcpp armadillo

在我正在 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 函数,但没有问题,但这是我制作的第一个使用函数指针的函数,因此我可以在调用此函数时指定内核。

最佳答案

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

我们只能从 R 调用映射到需要 SEXP 参数的 .Call() 接口(interface)的函数 --- 所以我们可以使用我们有映射器的类型进出 SEXP

这里最简单的方法是使用 Rcpp::XPtr。它提供了一个“外部指针接口(interface)”,您可以通过它传递内核函数。在 mkGramMatrix() 函数中,您可以将 XPtr 取消引用到您要调用的函数。这里和 Rcpp Gallery 上有几篇文章可以帮助您入门。这是一个很棒的机制:坚持下去并继续阅读。

关于c++ - RcppExport 错误原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43092162/

相关文章:

C++ VALGRIND 未初始化的值是由堆分配创建的

RStudio 未检测到 Rtools

rcpp - 使用 Rcpp 和 C++20 的 R 包

c++ - 使用 Rcpp 创建模块时出错

c++ - 如何拦截Sendmessage API

c++ - Vector:clear/pop_back 不会运行析构函数

c++ - 快速排序分区算法

r - 为什么 RStudio 在查看期间调用随机生成器?

r - 在 R Studio 文本编辑器中包装代码

r - 并行和 Rcpp Armadillo 问题 : Possible variable corruption between cluster workers