RcppExport 错误原因
Cause of error in RcppExport
在我正在 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
。它提供了一个 'external pointer interface' ,您可以通过它传递您的内核函数。在 mkGramMatrix()
函数中,您可以将 XPtr
取消引用到您要调用的函数。这里和 Rcpp Gallery 上有几篇文章可以帮助您入门。这是一个 很棒的 机制:坚持下去并继续阅读。
在我正在 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
。它提供了一个 'external pointer interface' ,您可以通过它传递您的内核函数。在 mkGramMatrix()
函数中,您可以将 XPtr
取消引用到您要调用的函数。这里和 Rcpp Gallery 上有几篇文章可以帮助您入门。这是一个 很棒的 机制:坚持下去并继续阅读。