这并不完全回答你的问题,但我在尝试解决类似问题时找到了它,所以我会给你展示一些东西。
假设你有一个函数,想要将其应用于矩阵的每个元素,该函数只需要一个部分。
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
apply()
函数族的函数?MARGIN参数可以接受行、列和行&列的数值。此外,不少R函数都是向量化的,可以避免这种类型的编程。 - Chasef()
的例子吗?据我所知,任何向量化函数都可以在矩阵上运行,因为它只是具有dim属性的向量。您不需要将其拆分为行和列索引。目前,在您的问题中存在一定的歧义;看起来您想要一个通用解决方案,但规定它应基于索引,这是次优的。 - Gavin Simpsonf()
,以便你实际上只需要m [] <- f(m)
?我会添加一个例子... - Gavin Simpson