我正在尝试用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/