簡體   English   中英

從Rcpp內調用igraph

[英]Calling igraph from within Rcpp

作為利用在進一步處理之前隨機抽取的網絡數據的一部分,我試圖在每次迭代的開始從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? 錯誤在哪里?

您在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)
*/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM