这并不完全回答你的问题,但我找到它时,试图找出一个类似的问题,所以我会告诉你的东西。
假设你有一个函数,你想要应用到矩阵的每个元素只需要一个部分。
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函数都是矢量化的,可以避免这种类型的编程。 – Chase
@leden你可以举一个'f()'的例子吗?据我所知,任何矢量化函数都可以在矩阵上工作,因为它只是一个具有dim属性的矢量。您不需要将其分解成行和列索引。目前,你Q中存在一些含糊不清的情况;似乎你想要一个通用的解决方案,但禁止它应该基于指数,这是次优的。 –
我的意思是,为什么不能写'f()',使得你真正需要的是'm [] < - f(m)'?我会添加一个例子... –