【问题标题】:Loop/ or apply function to feed list of igraph objects into function in R循环/或应用函数以将 igraph 对象列表馈送到 R 中的函数中
【发布时间】:2021-03-17 15:25:17
【问题描述】:

我想创建一个 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, size = 100, nei = 2, 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, seeds, 1000, 0.5)

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

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

【问题讨论】:

    标签: r igraph


    【解决方案1】:

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

    您似乎希望将sample 的元素作为值传递给sample_smallworld()size 参数。因此,最简单的方法可能是定义您自己的函数来重新排列参数的顺序,以便更轻松地使用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-03-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, 
                   seed = 1, 
                   steps = 1000, 
                   prob = 0.5)
    

    【讨论】:

    • 这非常有帮助,谢谢。如果我想在 lapply 函数中每次都有不同的种子怎么办?例如,我可以使用以下代码生成一个随机的节点列表作为种子:seeds
    • 我对这些特定函数不是很熟悉,但一般来说,要在 lapply() 的每次传递中为可选参数使用不同的值,您可能需要定义自己的函数来生成种子每次被调用时都在它的体内。这可以通过内联匿名函数来实现,例如:lapply(X = gs, FUN = function(graph) influence_ic(graph = graph, seed = sample.int(100, 5), steps = 1000, prob = 0.5))
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多