В качестве передового опыта я пытаюсь определить, лучше ли создавать функцию и apply()
через матрицу, или лучше просто процитировать матрицу через функцию. Я попробовал это в обоих направлениях и был удивлен, обнаружив, что apply()
работает медленнее. Задача состоит в том, чтобы взять вектор и оценить его как положительный или отрицательный, а затем вернуть вектор с 1, если он положительный и -1, если он отрицательный. Циклы функций mash()
и функция squish()
передаются функции apply()
.
million <- as.matrix(rnorm(100000))
mash <- function(x){
for(i in 1:NROW(x))
if(x[i] > 0)
x[i] <- 1
else
x[i] <- -1
return(x)
}
squish <- function(x){
if(x >0)
return(1)
else
return(-1)
}
ptm <- proc.time()
loop_million <- mash(million)
proc.time() - ptm
ptm <- proc.time()
apply_million <- apply(million,1, squish)
proc.time() - ptm
loop_million
результаты:
user system elapsed
0.468 0.008 0.483
apply_million
результаты:
user system elapsed
1.401 0.021 1.423
В чем преимущество использования apply()
в цикле for
, если производительность ухудшается? Есть ли недостаток в моем тесте? Я сравнил два результирующих объекта для подсказки и нашел:
> class(apply_million)
[1] "numeric"
> class(loop_million)
[1] "matrix"
Это только углубляет тайну. Функция apply()
не может принять простой числовой вектор, и поэтому я начал использовать его с as.matrix()
в начале. Но затем он возвращает числовое значение. Цикл for
хорош с простым числовым вектором. И он возвращает объект того же класса, что и тот, который ему передан.