【问题标题】:What should I use instead of pass-by-reference in R?我应该使用什么来代替 R 中的传递引用?
【发布时间】:2012-06-06 19:04:42
【问题描述】:

我在 R 中编写了一个函数,如果我可以通过引用传递,它将按我的意图工作。它涉及嵌套sapply 调用并在其中执行分配。由于 R 不使用按引用传递,因此这些函数不起作用。

我知道有诸如 R.oo 之类的软件包可以通过引用传递给 R,但我想了解是否有更好的方法。如果引用传递不可用,那么传递数据的“R”方式是什么?

【问题讨论】:

  • 您可以在环境中使用通过引用传递。如果您发布一个只能通过引用传递的函数示例,那么应该有人能够提供帮助。
  • ...另外,如果有可能实现函数 without 使用传递引用以更 R-ish 方式,我们仍然需要看一个例子也可以提供帮助。
  • 我猜最简单的方法是用 for 循环替换 sapply 调用。

标签: r design-patterns pass-by-reference


【解决方案1】:

如果你不修改参数,那么它实际上不会复制它,所以做任何特别的事情可能毫无意义:

> gc() # using 6.2 MB of Vcells
         used (Mb) gc trigger (Mb) max used (Mb)
Ncells 560642 15.0     984024 26.3   984024 26.3
Vcells 809878  6.2    2670432 20.4  2310055 17.7
> x <- as.numeric(1:1000000)
> gc() # now we are using 13.9 MB
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  560640 15.0     984024 26.3   984024 26.3
Vcells 1809867 13.9    2883953 22.1  2310055 17.7
> f0 <- function(x) { s <- sum(x); print(gc()); s }
> f0(x) # f0 did not use appreciably more despite using a huge vector
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  560655 15.0     984024 26.3   984024 26.3
Vcells 1809872 13.9    2883953 22.1  2310055 17.7
[1] 500000500000

编辑:对示例的细微更改

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2010-12-06
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多