我想知道申请家族是否可以在R中使用回归输入。 说我有:
apply(MyMatrix,1,MyFunc,MyMatrix)
我知道apply本质上是一个循环,所以在上面的例子中,它可以在MyFunc
的第一行MyMatrix
上运行一次MyMatrix
次迭代,然后选择修改后的MyMatrix
{{1}}进行下一次迭代?我意识到可以在这里使用普通循环,但我只是想知道是否有办法像这样做。
谢谢
答案 0 :(得分:2)
我不相信。即使全局修改MyMatrix
也不会更改传递给您的函数的MyMatrix
。 R函数不会以这种方式运行。当您的对象传递给函数时,实际上会复制该对象,然后存在该对象的新实例。它不是通过引用完成的。
答案 1 :(得分:1)
不幸的是,*apply
系列函数能够以这种方式工作。 (这对我来说有点令人沮丧,但我已经开始欣赏并使用它了。)
这有两个障碍:
*apply
系列函数在您进行调用时处理MyMatrix
的值,迭代行(在此示例中),然后加入结果(基于每个输出的尺寸)。每次都不会重新评估。
即使它重新评估它,MyFunc
一次只给出一行(在本例中),而不是整个矩阵。 (您对MyMatrix
的第二次引用似乎正在解决此问题。)
要做我认为你所说的话,那么你的MyFunc
函数需要接受整个矩阵和你操作的行作为参数,并返回有问题的行,ala:
MyFunc <- function(rownum, mtx) {
# ...
mtx[rownum,]
}
使用这个前提,你可以这样做:
for (rr in seq.int(nrow(MyMatrix))) {
MyMatrix[rr,] <- MyFunc(rr, MyMatrix)
}
或者,如果您必须留在*apply
家庭:
MyMatrix.new <- sapply(seq.int(nrow(MyMatrix)), MyFunc, MyMatrix)
您可能希望在t()
返回转置(sapply()
)。
如果MyFunc
返回整个矩阵而不是一行,则可以稍微改变一下。
我知道没办法直接做你的建议。