gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:59:09 24 4
gpt4 key购买 nike

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

mySum <- function(x, y){
return(2*x + 3*y)
}
x <<- 1
y <<- 1

现在考虑我要在其中访问上述功能的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)));
}

当我使用内联函数sourceCpp()在R中获取文件时,出现错误:
 "invalid conversion from 'SEXPREC*' to int

有人可以帮我调试代码吗?我的代码有效吗?可以总结一下吗?有没有比我在代码中使用mySum函数更好的主意了?

非常感谢您的帮助。

最佳答案

您声明函数应返回int,但使用wrap表示返回的对象应为SEXP。此外,从Rcpp调用R函数(通过Function)也将返回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));
}

(或者,将函数return保留为 int,并使用 as<int>代替 wrap)。

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

关于r - 使用Rcpp从C++调用用户定义的R函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21225662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com