从R

时间:2016-11-11 19:17:42

标签: c++ r rcpp armadillo

我有一个名为“file1.cpp”的C ++函数,它看起来像:

#include <cmath> 
#include <stdio.h> 
#include <RcppArmadillo.h> 
#include <boost/math/special_functions/gamma.hpp> 
#include <mpi.h> 
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
using namespace std;
using namespace arma;
using namespace boost::math;
const double PIVAL = std::acos(0.0)*2;
class function1
{
...
}
extern "C"
void functin2
{
...
}

我想从R函数调用它。为了做到这一点,我需要先编译它以获取“file1.so”,稍后我可以在R命令中使用它:

dyn.load("file1.so.so")

所以我写的是ubuntu 16.10终端:

$ R CMD SHLIB file1.cpp -O2 -larmadillo -llapack -lblas

当我按回车键时,我将收到以下错误消息:

g++ -I/usr/share/R/include -DNDEBUG      -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-rAT5Oi/r-base-3.3.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g  -c file1.cpp -o file1.o
file1.cpp:12:81: fatal error: RcppArmadillo.h: No such file or directory
 #include <RcppArmadillo.h>

我无法找到该错误的解决方案。所以,我试着从Rstudio里面调用C ++函数。我写下了以下命令:

library(Rcpp)
library(RcppArmadillo)
sourceCpp("file1.cpp")
function2()

执行时我会收到此错误:

file1.cpp:11:81: fatal error: RcppArmadillo.h: No such file or directory

有人知道如何解决它吗?提前谢谢。

最诚挚的问候,

1 个答案:

答案 0 :(得分:2)

请在包装文档中的Rcpp Gallery或天堂禁止,阅读RcppArmadillo上的一些许多现有示例。

当然只需致电RcppArmadillo.package.skeleton()并为您创建工作包即可开始并将您的本地更改添加到其中。

见:

R> setwd("/tmp")
R> RcppArmadillo::RcppArmadillo.package.skeleton("demoPkg")

Calling kitten to create basic package.
Creating directories ...
Creating DESCRIPTION ...
Creating NAMESPACE ...
Creating Read-and-delete-me ...
Saving functions and data ...
Making help files ...
Done.
Further steps are described in './demoPkg/Read-and-delete-me'.

Adding pkgKitten overrides.
Deleted 'Read-and-delete-me'.
Done.

Consider reading the documentation for all the packaging details.
A good start is the 'Writing R Extensions' manual.

And run 'R CMD check'. Run it frequently. And think of those kittens.


Adding RcppArmadillo settings
 >> added Imports: Rcpp
 >> added LinkingTo: Rcpp, RcppArmadillo
 >> added useDynLib and importFrom directives to NAMESPACE
 >> added Makevars file with Rcpp settings
 >> added Makevars.win file with RcppArmadillo settings
 >> added example src file using armadillo classes
 >> added example Rd file for using armadillo classes
 >> invoked Rcpp::compileAttributes to create wrappers
R> 

创建,_inter alia,此文件:

// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*-

// we only include RcppArmadillo.h which pulls Rcpp.h in for us
#include "RcppArmadillo.h"

// via the depends attribute we tell Rcpp to create hooks for
// RcppArmadillo so that the build process will know what to do
//
// [[Rcpp::depends(RcppArmadillo)]]

// simple example of creating two matrices and
// returning the result of an operatioon on them
//
// via the exports attribute we tell Rcpp to make this function
// available from R
//
// [[Rcpp::export]]
arma::mat rcpparma_hello_world() {
    arma::mat m1 = arma::eye<arma::mat>(3, 3);
    arma::mat m2 = arma::eye<arma::mat>(3, 3);

    return m1 + 3 * (m1 + m2);
}


// another simple example: outer product of a vector, 
// returning a matrix
//
// [[Rcpp::export]]
arma::mat rcpparma_outerproduct(const arma::colvec & x) {
    arma::mat m = x * x.t();
    return m;
}

// and the inner product returns a scalar
//
// [[Rcpp::export]]
double rcpparma_innerproduct(const arma::colvec & x) {
    double v = arma::as_scalar(x.t() * x);
    return v;
}


// and we can use Rcpp::List to return both at the same time
//
// [[Rcpp::export]]
Rcpp::List rcpparma_bothproducts(const arma::colvec & x) {
    arma::mat op = x * x.t();
    double    ip = arma::as_scalar(x.t() * x);
    return Rcpp::List::create(Rcpp::Named("outer")=op,
                              Rcpp::Named("inner")=ip);
}

这应该足以让你前进。