2014-03-28 29 views
0

我想知道是否可以在R中使用适用系列并回归输入。 说我有:R中的动态输入适用

apply(MyMatrix,1,MyFunc,MyMatrix) 

我知道,申请基本上是一个循环,所以在上面的例子中它可以运行的MyFunc一个迭代超过MyMatrix第一行修改MyMatrix全球范围内,然后选择该修改的MyMatrix下一次迭代?我意识到可以在这里使用正常的循环,但我只是想知道是否有办法像这样做。

谢谢

回答

2

我不这么认为。即使修改全球范围内的MyMatrix也不会更改传递到您的功能的MyMatrix。 R函数不会这样操作。当你的对象被传入一个函数并且它的一个新实例存在时,它实际上会被复制。这不是通过参考完成的。

+0

这就是我的想法。我期待完全避免循环,但现在我发现应用只是另一个循环,我不会真的获得任何效率。谢谢你的时间 ! – Pane

1

不幸的是,*apply功能家族能够以这种方式工作。 (这有时是一个挫折对我好,但我是来欣赏和使用它。)

有两个障碍是:

  1. *apply家庭功能的交易在调用时调用MyMatrix的值,遍历行(在本例中),然后加入结果(基于每个输出的维数)。它不会每次重新评估。

  2. 即使它重新评估它,MyFunc一次只给出一行(在本例中),而不是整个矩阵。 (你的第二个参考MyMatrix出现这个问题,才能奏效。)

做什么,我觉得你说的,那么你的MyFunc功能需要接受作为参数的整个矩阵和行上你操作,并在问题刚刚返回的行,鼻翼:

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) 

你可能想从这里sapply()回归的转置(t())。

如果MyFunc返回整个矩阵而不是只有一行,这可以做一点不同。

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

+0

我想这是没有办法的。我认为我有一个不惜一切代价避免循环的坏习惯,即使[我刚刚意识到这一点]适用基本上是一个循环。谢谢你的时间 ! – Pane

+0

我也避免了循环,但最近的性能基准测试显示循环不一定更慢。有时候'apply'系列提供了一个真正优雅的解决方案,但是我发现自己努力想要获得这种优雅,事实上,循环可以更加可读。干杯! – r2evans