我是R的新手,我试图弄清楚如何使用sapply更快地使我的功能更快?有什么帮助吗?
x <- c(0.0, 1.0, 2.0, 3.0, 4.0, 5.7)
y <- c(10.0, 7.0, 5.5, 4.5, 3.2, NA)
z <- c(as.data.frame(cbind(x,y))
vcub=function(y, x, z)
{
vol<-vector()
for(i in 1:dim(z)[1]){
if(is.na(y[i]))
{
vol[i]<-(((pi*y[i-1]^2)/40000)/3)*(x[i]-x[i-1])
}else{
vol[i]<-(((pi*y[i-1]^2) + (pi*y[i]^2))/80000)*(x[i]-x[i-1])
}
}
return(as.data.frame(vol))
}
答案 0 :(得分:1)
您可以使用if
语句替换for循环中的else
和ifelse
语句并使用R中的向量化算法来对此代码进行矢量化:
data.frame(vol=ifelse(is.na(y), pi*c(NA, head(y, -1)^2)/120000*c(NA, diff(x)),
pi*(y^2 + c(NA, head(y, -1)^2))/80000*c(NA, diff(x))))
# vol
# 1 NA
# 2 0.0058512163
# 3 0.0031121402
# 4 0.0019831304
# 5 0.0011973395
# 6 0.0004557404
通常,当您可以计算结果的第i个索引而不使用您计算的任何先前索引时,很容易对计算进行矢量化。由于您的vol[i]
公式不依赖于之前的任何vol
值,因此您可以使用基本的算术运算符。