我正在尝试用for函数替换sapply循环。在循环内部,我进行了一些优化,因此需要对下一个循环进行一次优化。

我想出了如何使用sapply来运行优化,但是问题是我需要从sapply中访问以前的结果。

以下只是我要达到的目标的一个随机示例。

sapply(1:4, function(y){
  r<-y
  if(y!=1){z<-r[y-1]}
  else{z<-9}
  return(z)
  })

[1,]    9    2   NA   NA

我期望得到的是这样的:
[1,]    9    1    2   3

我究竟做错了什么?还是没有任何方法可以访问sapply中的先前迭代结果?

最佳答案

这是一个可能更接近OP用例的示例:

f    = function(x) x^2
g    = function(x) abs(x)+rnorm(1)
yvec = 1:4

这是@Andrie提到的Reduce方法:
set.seed(1)
Reduce(function(z,y) if (is.na(z)) f(y) else g(z), yvec,init=NA_real_,accumulate=TRUE)[-1]
# [1]  1.0000000  0.3735462  0.5571895 -0.2784391

这是每个人都会使用的常识循环(由@digEmAll提及):
set.seed(1)
res <- rep(NA_real_,length(yvec))
for (i in seq_along(yvec)) res[i] = if (i==1) f(yvec[i]) else g(res[i-1])
res
# [1]  1.0000000  0.3735462  0.5571895 -0.2784391

结果是相同的,因此Reduce只是隐藏了循环,如@Roland所断言的那样。

关于r - 访问lapply/sapply中的先前元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31610303/

10-11 07:50