1

我在 R 中有以下 for 循环:

v = c(1,2,3,4)
s = create.some.complex.object()
for (i in v){
   print(i)
   s = some.complex.function.that.updates.s(s)
}
# s here has the right content.

不用说,这个循环在 R 中非常慢。我尝试用函数式编写它:

   lapply(v, function(i){
      print(i)
      s = some.complex.function.that.updates.s(s)
   })
   # s wasn't updated.

但这不起作用,因为s它是按值传递的,而不是按引用传递的。我只需要最后一次迭代的结果,而不是所有的中间步骤。如何制定 R 风格的第一个循环?

穆龙

4

3 回答 3

3
   lapply(v, function(i){
      print(i)
      s = some.complex.function.that.updates.s(s)
      return(s)
   })

结果将是s为 的每个值创建的对象列表v。即使它应该传递了v反正的值,因为它是函数执行的最后一个操作。

于 2013-06-15T16:51:52.153 回答
1

如果您不能多次创建它,那么就没有太多选择了。如果没有看到您正在操作的对象,也很难说。如果对象正在增长/追加,您可以收集中间结果并在最后进行追加。如果它实际上是变异的,您应该尝试摆脱传递值并使用参考类(http://www.inside-r.org/r-doc/methods/ReferenceClasses)。那么修改它的函数实际上就是你调用 n 次的方法。

于 2013-06-15T18:01:53.897 回答
0

循环本身真的是问题吗?还是执行 some.complex.function.that.updates.s 需要的时间?一些 R 程序员会跳过箍来避免循环,但看看这个例子:

f <- function(a) a/1.001
loop <- function(n) { s = (1/f(1)^n); for (i in 1:n) s <- f(s); s}
system.time(loop(1E7))
   user  system elapsed 
  7.011   0.030   7.008

这是 0.7 微秒(在 MacBook Pro 上),每次调用循环中非常微不足道的函数。

于 2013-06-15T20:29:37.213 回答