【问题标题】:Global variable only within scope of R function仅在 R 函数范围内的全局变量
【发布时间】:2018-02-20 03:09:48
【问题描述】:
mat <- large matrix
f1 <- function(M) {
    X <<- M
    f1 <- function() {
        do something with X but does not modify it 
    }
}
f1(mat)
X is no longer in scope

如何在 R 中实现上述伪代码中描述的内容?在 MATLAB 中,您可以使用“全局 X”。 R中的等价物是什么?如果没有,处理上述情况的最有效方法是什么:一个函数将一个大矩阵作为参数,其中许多不同的辅助函数作用于该矩阵(但不要修改它)因此矩阵需要尽量少复制。感谢您的帮助。

【问题讨论】:

  • 你在 X 上执行什么样的操作?如果您不希望 R 重复复制矩阵,您可能需要“通过引用更改”的东西
  • 由于词法作用域,内部函数应该已经可以访问M,所以我不确定X &lt;&lt;- 分配会实现什么。此外,R 已经尝试不复制,除非有必要,所以我不确定这实际上是一个多大的问题,请参阅discussion here。
  • @Marius 内部、内部函数呢?如果我使用 X
  • 我还想提一下,我的函数需要 gpu 支持,所以我使用的是 gpuR 的 vclMatrix。这些矩阵位于 GPU RAM 中,因此即使在 GPU 矩阵制作完成后,我也绝对无法复制它,否则内存将被真正堵塞。
  • 我可能是错的,但我认为如果你将它作为参数传递并且不修改它,R 实际上并没有制作对象的副本。如果是,您可以使用data.tables,然后就不会了。

标签: r matrix scope global-variables memory-efficient


【解决方案1】:

我不确定你想用你的辅助函数实现什么,但正如@Marius 在评论中提到的那样,内部函数应该已经可以访问M。因此,这样的代码会起作用:

f1 <- function(M) {
  f2 <- function() {
    f3 <- function() {
      # f3 divides M by 2
      M/2
    }
    # f2 prints results from f3 and also times M by 2
    print(f3())
    print(M * 2)
  }
  # f1 returns results from f2
  return(f2())
}

mat <- matrix(1:4, 2)

f1(mat)
#      [,1] [,2]
# [1,]  0.5  1.5
# [2,]  1.0  2.0
#      [,1] [,2]
# [1,]    2    6
# [2,]    4    8

mat
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    4

这里不需要在f1 中执行X &lt;&lt;- M,尤其是如果您不想在内存中复制M。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多