【问题标题】:Calling igraph from within Rcpp从 Rcpp 中调用 igraph
【发布时间】:2018-08-24 06:13:05
【问题描述】:

作为在进一步处理之前利用随机抽取的网络数据的一部分,我试图在每次迭代开始时从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 类传递给双精度类?哪里出错了?

【问题讨论】:

    标签: r igraph rcpp rcpp11


    【解决方案1】:

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

    【讨论】:

    • 不错!这节省了从 igraph 复制一小部分功能的大量工作!
    • 不客气。也可以随意投票(点击向上箭头)。
    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多