R中的动态输入适用

时间:2014-03-28 00:00:03

标签: r input apply

我想知道申请家族是否可以在R中使用回归输入。 说我有:

apply(MyMatrix,1,MyFunc,MyMatrix)

我知道apply本质上是一个循环,所以在上面的例子中,它可以在MyFunc的第一行MyMatrix上运行一次MyMatrix次迭代,然后选择修改后的MyMatrix {{1}}进行下一次迭代?我意识到可以在这里使用普通循环,但我只是想知道是否有办法像这样做。

谢谢

2 个答案:

答案 0 :(得分:2)

我不相信。即使全局修改MyMatrix也不会更改传递给您的函数的MyMatrix。 R函数不会以这种方式运行。当您的对象传递给函数时,实际上会复制该对象,然后存在该对象的新实例。它不是通过引用完成的。

答案 1 :(得分:1)

不幸的是,*apply系列函数能够以这种方式工作。 (这对我来说有点令人沮丧,但我已经开始欣赏并使用它了。)

这有两个障碍:

  1. *apply系列函数在您进行调用时处理MyMatrix的值,迭代行(在此示例中),然后加入结果(基于每个输出的尺寸)。每次都不会重新评估。

  2. 即使它重新评估它,MyFunc一次只给出一行(在本例中),而不是整个矩阵。 (您对MyMatrix的第二次引用似乎正在解决此问题。)

  3. 要做我认为你所说的话,那么你的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返回整个矩阵而不是一行,则可以稍微改变一下。

    我知道没办法直接做你的建议。

相关问题