从Rcpp内部调用igraph

时间:2018-03-15 12:21:21

标签: r igraph rcpp rcpp11

作为在进一步处理之前随机抽取网络数据的一部分,我试图在每次迭代开始时从igraph包中调用几个函数。我使用的代码如下:

#define ARMA_64BIT_WORD
#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
using namespace Rcpp;

using arma::sp_mat;

// [[Rcpp::export]]
sp_mat adj_mat(int n, double p) {

  Environment igraph("package:igraph");
  Function game_er = igraph["erdos.renyi.game"];
  Function get_adjacency = igraph["get.adjacency"];

  List g = game_er(Named("n", n), Named("p", p));

  NumericMatrix A_m = get_adjacency(Named("g", g));

  sp_mat A = as<sp_mat>(A_m);

  return A;
}


/*** R
set.seed(20130810)
library(igraph)

adj_mat(100, 0.5)
*/

因此,虽然C ++在没有警告的情况下编译,但会抛出以下错误:

> sourceCpp("Hooking-R-in-cpp.cpp")

> set.seed(20130810)

> library(igraph)

> adj_mat(100, 0.5)
Error in adj_mat(100, 0.5) : 
  Not compatible with requested type: [type=S4; target=double].

从错误看,我将S4类传递给double?错误在哪里?

1 个答案:

答案 0 :(得分:4)

您在C ++函数中强加了与表示形式不对应的类型,因此您尝试实例化它们时会遇到运行时错误。

以下版本有效。我不太了解igraph,以便建议你用什么来存储第一个回报;对于S4,你可以使用dgCMatrix矩阵,但S4是一个好的超集。

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
using namespace Rcpp;

using arma::sp_mat;

// [[Rcpp::export]]
sp_mat adj_mat(int n, double p) {

  Environment igraph("package:igraph");
  Function game_er = igraph["erdos.renyi.game"];
  Function get_adjacency = igraph["get.adjacency"];

  SEXP g = game_er(Named("n", n), Named("p", p));

  S4 A_m = get_adjacency(Named("g", g));

  sp_mat A = as<sp_mat>(A_m);

  return A;
}

/*** R
set.seed(20130810)
library(igraph)

adj_mat(100, 0.5)
*/