gpt4 book ai didi

r - 在没有循环的R中对连续的列表元素对应用函数

转载 作者:行者123 更新时间:2023-12-04 11:11:58 26 4
gpt4 key购买 nike

我试图找到一种有效(即避免使用循环)的方法来应用一个函数,该函数迭代地将列表的当前和前一个(或下一个)元素作为参数并返回结果列表(其长度必然是1 个元素短)。
作为一个具体的例子,

我有一个顶点列表,在某些图中定义了一条路径

vlist <- c(1,2,7,12,17)

它来自使用 igraph 函数“lattice”构建的格图
G <- graph.lattice(c(5,7))

我想在 vlist 上应用函数“get.edge.ids”,以便返回的列表产生连接 vlist 中连续元素的边的 id。
例如。我想要边缘 1-->2、2-->7、7-->12、12-->17 的 id

使用 for 循环这很简单,
    findEids <- function(G,vlist) {
outlist=c()
for (i in 1:(length(vlist)-1) {
outlist=append(outlist,get.edge.ids(G,c(vlist[i],vlist[i+1])))
}
return(outlist)
}

但我想使用像 apply() 或 reduce() 这样的矢量化方法来看看我是否可以让它更快地工作,因为我需要从脚本中重复调用这样的函数(例如,计算总拉伸(stretch)对于 G 的生成树)。

最佳答案

我用 mapply为了那个原因。例如

a<-1:1000
mapply(function(x,y)x-y,a[-1000],a[-1])

它似乎比 for 循环版本稍快:
> f <- function(x,y)x-y
> g <- function(){
o<-c();
for(i in a[-1000])o<-c(o,f(i,i+1))
> }


>
> system.time(
+ for(i in 1:1000){
+ mapply(f,a[-1000],a[-1])
+ }
+ )
user system elapsed
2.344 0.000 2.345


> system.time(for(i in 1:1000)g())
user system elapsed
3.399 0.000 3.425

关于r - 在没有循环的R中对连续的列表元素对应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799674/

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