使用Rcpp从C++调用用户定义的R函数

Sam*_*Sam 8 r rcpp

我有一个带有一堆用户定义的R函数的R代码.我试图让代码运行得更快,当然最好的选择是使用Rcpp.我的代码涉及相互调用的函数.因此,如果我用C++编写一些函数,我应该能够在我的c ++代码中调用并运行一些R函数.在一个简单的例子中,考虑R中的以下代码:

mySum <- function(x, y){
 return(2*x + 3*y)
}
x <<- 1
y <<- 1
Run Code Online (Sandbox Code Playgroud)

现在考虑我正在尝试访问上述函数的C++代码:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int mySuminC(){
 Environment myEnv = Environment::global_env();
 Function mySum = myEnv["mySum"];
 int x = myEnv["x"];
 int y = myEnv["y"];
 return wrap(mySum(Rcpp::Named("x", x), Rcpp::Named("y", y)));
 }
Run Code Online (Sandbox Code Playgroud)

当我使用内联函数sourceCpp()在R中源文件时,我收到错误:

 "invalid conversion from 'SEXPREC*' to int
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我调试代码吗?我的代码有效吗?可以归纳一下吗?使用mySum函数比我在代码中做的更好吗?

非常感谢您的帮助.

Kev*_*hey 12

你声明该函数应该返回一个int,但是使用wrap指示返回的对象应该是a SEXP.此外,从Rcpp(通过Function)调用R函数也返回a SEXP.

你想要的东西:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
SEXP mySuminC(){
  Environment myEnv = Environment::global_env();
  Function mySum = myEnv["mySum"];
  int x = myEnv["x"];
  int y = myEnv["y"];
  return mySum(Rcpp::Named("x", x), Rcpp::Named("y", y));
}
Run Code Online (Sandbox Code Playgroud)

(或者,将函数返回intas<int>代替使用wrap).

也就是说,这是一种非惯用的Rcpp代码.请记住,从C++调用R函数仍然会很慢.