在构建 R 包时从另一个 Rcpp 函数调用 Rcpp 函数

Posted

技术标签:

【中文标题】在构建 R 包时从另一个 Rcpp 函数调用 Rcpp 函数【英文标题】:Calling a Rcpp function from another Rcpp function while building an R package 【发布时间】:2014-06-25 00:22:55 【问题描述】:

我从另一个问题中举了这个例子。我正在用 Rcpp 构建一个 R 包。我有一个像fun1(下)这样的函数,我想将它放入它自己的.cpp 文件中。然后我想用其他函数调用fun1(就像下面的fun() 一样)。我想将fun1 放在一个单独的文件中,因为我要从不同.cpp 文件中的几个Rcpp 函数调用它。是否有某些包含语句和我需要做的事情才能使.cpp 中的fun1 函数可以访问fun() 所在的位置?谢谢你。

library(inline)
library(Rcpp)
a = 1:10
cpp.fun = cxxfunction(signature(data1="numeric"), 
                  plugin="Rcpp",
                  body="
int fun1( int a1)
int b1 = a1;
 b1 = b1*b1;
 return(b1);


NumericVector fun_data  = data1;
int n = data1.size();
for(i=0;i<n;i++)
fun_data[i] = fun1(fun_data[i]);

return(fun_data);
                           ")

所以对于我的代码,我将有两个 .cpp 文件:

#include <Rcpp.h>
using namespace Rcpp;
// I think I need something here to make fun1.cpp available?

// [[Rcpp::export]]
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
 
    NumericVector fun_data  = data1;
    int n = data1.size();
    for(i=0;i<n;i++)
    fun_data[i] = fun1(fun_data[i]);
    
    return(fun_data);

还有第二个.cpp 文件:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int fun1( int a1)
int b1 = a1;
 b1 = b1*b1;
 return(b1);

【问题讨论】:

这真的是 C++ 的基本用法,与 Rcpp 无关。学习使用任何像样的 C++(甚至 C)书籍都会涵盖的通用头文件。 【参考方案1】:

两种可能的解决方案:

'quick-and-dirty',解决方案——在你使用它的文件中包含函数声明:

#include <Rcpp.h>
using namespace Rcpp;

// declare fun1
int fun1(int a1);

// [[Rcpp::export]]
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
 
    NumericVector fun_data  = data1;
    int n = data1.size();
    for(i=0;i<n;i++)
    fun_data[i] = fun1(fun_data[i]);
    
    return(fun_data);

更健壮的解决方案:编写声明函数的头文件,然后可以在每个文件中使用#include-ed。所以你可能在同一个src目录中有一个头文件fun1.h

#ifndef PKG_FOO1_H
#define PKG_FOO1_H

int foo(int);

#endif

然后您可以将其与以下内容一起使用:

#include <Rcpp.h>
#include "fun1.h"
using namespace Rcpp;

// [[Rcpp::export]]
Rcpp::NumericVector fun(Rcpp::NumericVector data1) 
 
    NumericVector fun_data  = data1;
    int n = data1.size();
    for(i=0;i<n;i++)
    fun_data[i] = fun1(fun_data[i]);
    
    return(fun_data);

随着您的进步,您将需要学习更多 C++ 编程技能,因此我建议您查看one of the books here;特别是Accelerated C++ 是一个很好的介绍。

【讨论】:

感谢您的明确回答,这非常有效。在此之前,我不知道 .h 文件与 Rcpp 一起使用或将它们放在哪里。我有一年的 C++ 课程,所以很多 Rcpp 文档仍然相当难以访问。但是 Rcpp 对 MCMC 来说非常棒。

以上是关于在构建 R 包时从另一个 Rcpp 函数调用 Rcpp 函数的主要内容,如果未能解决你的问题,请参考以下文章

RCPP Armadillo:在函数中打印整数值

在 Windows 上使用 C++11 和 Rcpp 构建 R 包

如何在Rstudio中调用Rcpp向量的对数函数

将 C++ 函数用作由导出的 Rcpp 函数调用的另一个 C++ 函数的参数

如何在将 Tablayout 与 viewpager 一起使用时从另一个片段调用 AsyncTask?

构建 R 包时如何链接静态库