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

时间:2014-05-07 20:27:23

标签: r function include package rcpp

我从另一个问题中拿了这个例子。我正在用Rcpp构建一个R包。我有一个像fun1(下面)这样的函数,我希望将它放入自己的.cpp文件中。然后我想用其他函数调用fun1(如下面fun()所示)。我希望fun1在一个单独的文件中,因为我将从不同.cpp文件中的几个Rcpp函数调用它。我是否需要执行某些包含语句和事项才能在fun1所在的.cpp中访问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);
}

1 个答案:

答案 0 :(得分:12)

两种可能的解决方案:

'快速而肮脏'的解决方案 - 在您使用它的文件中包含函数声明:

#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。因此,您可能在同一fun1.h目录中有一个头文件src

#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++是一个很好的介绍。