【问题标题】:Apply function to a list of network objects with different function arguments将函数应用于具有不同函数参数的网络对象列表
【发布时间】:2019-02-11 23:38:24
【问题描述】:

我有一个 igraph 网络对象列表和一个函数,我想将其应用于每个网络,每个网络具有一组不同的函数参数。

可重现的例子:

# network
network <- graph(c("1","2","3","4"),directed = FALSE)

# making a list of graph objects
Converted <- list(network)
List <- rep(Converted,10)

# List with different parameters (Function arguments)
Xvalues <- 1:10

# function to add x nodes to the network
AddNode <- function(network,x){

        for (i in 1:x){

                network <- network + vertex(as.character(length(V(network)) + 1)) 

        }

        return(network)
}

我想要的是使用带有第 i 个参数集的函数作为网络列表的第 i 个元素上的函数参数。当然,这适用于 for 循环,但我真的很想使用 lapply、mapply、map 等找到解决方案,因为它会使脚本的其余部分更容易阅读和并行化(实际脚本中的函数是复杂得多,并且不涉及 for 循环)。

这是我到目前为止没有成功的尝试:

应用

ResultList <- lapply(List,AddNode,Xvalues)

映射

ResultList <- mapply(AddNode,List,Xvalues)

地图

ResultList <- map(.x = List,.f=AddNode,x=Xvalues)

使用 for 循环的次优解决方案:

ResultList <- list(NA)
ResultList <- rep(ResultList,10)

for (i in Xvalues){

        ResultList[[i]] <- map(.x = List[i],.f=AddNode, x = Xvalues[i])

}

【问题讨论】:

  • 你的参数长度比你的列表短,这是故意的吗?
  • 是的,你的 List 包含 10 个元素,但 Xvalues 只包含 4 个元素。在函数调用期间这些元素应该如何匹配?
  • 当然,这适用于 for 循环 ...请说明它如何适用于 for 循环。现在你只分配一个包含for 循环的函数。请发布调用AddNode的工作解决方案。
  • 你说的完全正确! Xvalues 应该是 1:10,我从脚本中复制粘贴了错误的行。对此感到抱歉。我将更新我的示例并使用我提到的 for 循环添加解决方案。

标签: r igraph lapply mapply


【解决方案1】:

您的Xvalues 需要与您的List 长度相同,并且您需要在mapply 中添加SIMPLIFY=F 参数:

Xvalues <- 1:10
ResultList <- mapply(AddNode,List,Xvalues, SIMPLIFY=F)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多