【问题标题】:calling a user-defined R function from C++ using Rcpp使用 Rcpp 从 C++ 调用用户定义的 R 函数
【发布时间】:2014-02-09 03:08:04
【问题描述】:

我有一个包含一组用户定义的 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 函数更好的主意?

非常感谢您的帮助。

【问题讨论】:

标签: r rcpp


【解决方案1】:

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

(或者,将函数返回保留为int 并使用as&lt;int&gt; 代替wrap)。

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

【讨论】:

  • 是的。这里有一些先前的答案表明了同样的观点。
  • @DirkEddelbuettel 和 Kevin,我对这篇文章还有另一个问题。考虑一个典型的 C++ 程序,它有一堆在 int main() 块之外声明并在块内使用的函数。现在考虑 cxxfunction() 中的 body 参数,对我来说,body 有点像 int main() 块内部的内容。我的问题是在哪里声明我们在 main() 之外并在 cxxfunction() 中使用的那些函数?
  • @DirkEddelbuettel,绝对的。
  • 如何从 R 函数中获取返回值?实际上stackoverflow.com/a/21225890/9113303 在这里我们将 R 函数称为 mySum。所以我们应该得到返回值return(2*x + 3*y)。但是我在运行 R studio 时得到了 Rcpp::sourceCpp('Desktop/cuda_pgm_cpp/mySum.cpp')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多