gpt4 book ai didi

r - 从 Rcpp 中调用 igraph

转载 作者:行者123 更新时间:2023-12-04 03:00:53 28 4
gpt4 key购买 nike

作为在进一步处理之前利用随机抽取的网络数据的一部分,我试图在每次迭代开始时调用 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)
*/

关于r - 从 Rcpp 中调用 igraph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49299368/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com