В соответствии с передовой практикой я пытаюсь определить, действительно ли это » Лучше создать функцию и 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
подходит для простого числового вектора. И он возвращает объект того же класса, что и переданный ему.