微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

循环/或应用函数将 igraph 对象列表提供给 R 中的函数

如何解决循环/或应用函数将 igraph 对象列表提供给 R 中的函数

我想创建一个 igraph 对象列表,然后将该列表输入到两个模拟信息扩散的函数中。具体来说,我想生成一个随机生成的小世界和无标度网络的列表,然后将这些列表输入到两个应用信息扩散的独立级联和线性阈值模型的函数中。

我可以使用 lapply 创建一个包含 1000 个独特的无标度 igraph 对象(大小为 100 个节点)的列表:

sample <- as.list(rep(100,1000))
                 
list <- lapply(X = sample,FUN = sample_pa)

然而,这对于需要参数的小世界函数来说并不容易:

sample <- as.list(rep(100,1000))

list <- lapply(X = sample,FUN = sample_smallworld(dim = 1,size = 100,nei = 2,p = 0.25))

我收到此错误

Error in match.fun(FUN) : 
'sample_smallworld(dim = 1,p = 0.25)' is not a function,character or symbol

然后我想将这个 igraph 对象列表提供给 influence.maximization package 中的几个函数

# independent cascade:
out <- influence_ic(g,seeds,1000,0.5))
# linear threshold:
out2 <- influence_lt(g,0.5)

这些函数接受一个 igraph 对象(g,这将是我上面创建的列表)、种子(初始活动节点列表)、步骤(运行的次数)和激活的概率或阈值(在我的示例中为 0.5 )

如何修复我的 lapply 代码以接受 sample_smallworld() 函数,以及如何将这些 igraph 对象列表提供给这些影响函数?最终,我想从 1000 个唯一 igraph 对象中的每一个中获得一个数据框或激活节点数的列表。

解决方法

lapply() 的工作原理是将 X 的元素传递到 FUN 参数下列出的函数的第一个位置。然后可以使用 ... 按名称传入任何其他参数。

您似乎希望将 sample 的元素作为值传递给 sizesample_smallworld() 参数。因此,定义您自己的函数来重新排列参数的顺序以更轻松地使用 lapply() 可能是最简单的,如下所示:

hundos <- as.list(rep(100,1000))

my_sample_smallworld <- function(size,...) {
  igraph::sample_smallworld(size = size,...)
}

gs <- lapply(X = hundos,FUN = my_sample_smallworld,dim = 1,nei = 2,p = 0.25)

reprex package (v1.0.0) 于 2021 年 3 月 17 日创建

lapply() 与其他包的函数的应用将与 sample_pa() 相同,因为您希望传入的对象将作为第一个参数传递。因此您不需要编写自定义函数:

out <- lapply(X = gs,FUN = influence_ic,seed = 1,steps = 1000,prob = 0.5)

out2 <- lapply(X = gs,FUN = influence_lt,prob = 0.5)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。