【发布时间】: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 循环添加解决方案。