Это не дает точного ответа на ваш вопрос, но я нашел его, пытаясь выяснить аналогичный вопрос, поэтому я покажу вам кое-что.
Скажем, у вас есть функция, которую вы хотите применить к каждому элементу матрицы, которая требует только одну часть.
mydouble <- function(x) {
return(x+x)
}
И скажем, у вас есть матрица X,
> x=c(1,-2,-3,4)
> X=matrix(x,2,2)
> X
[,1] [,2]
[1,] 1 -3
[2,] -2 4
тогда вы делаете это:
res=mydouble(X)
Тогда он будет делать поэлементное удвоение каждого значения.
Однако, если вы выполните логику в функции, как показано ниже, вы получите предупреждение о том, что она не параметризована и ведет себя не так, как вы ожидаете.
myabs <- function(x) {
if (x<0) {
return (-x)
} else {
return (x)
}
}
> myabs(X)
[,1] [,2]
[1,] 1 -3
[2,] -2 4
Warning message:
In if (x < 0) { :
the condition has length > 1 and only the first element will be used
Но если вы используете функцию apply (), вы можете использовать ее.
Например:
> apply(X,c(1,2),myabs)
[,1] [,2]
[1,] 1 3
[2,] 2 4
Так что это здорово, верно? Ну, это ломается, если у вас есть функция с двумя или более параметрами. Скажем, например, у вас есть это:
mymath <- function(x,y) {
if(x<0) {
return(-x*y)
} else {
return(x*y)
}
}
В этом случае вы используете функцию apply (). Тем не менее, он потеряет матрицу, но результаты рассчитаны правильно. Они могут быть исправлены, если вы так склонны.
> mapply(mymath,X,X)
[1] 1 -4 -9 16
> mapply(mymath,X,2)
[1] 2 4 6 8
> matrix(mapply(mymath,X,2),c(2,2))
[,1] [,2]
[1,] 2 6
[2,] 4 8