全局变量仅在R函数的范围内

时间:2018-02-20 03:09:49

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

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中,您可以使用&#34;全局X&#34;。 R中的等价物是什么?如果没有,那么处理上述场景的最有效方法是什么:函数接受一个大矩阵作为参数,并且其中的许多不同的辅助函数作用于该矩阵(但不修改它)因此矩阵需要被复制的次数尽可能少。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我不确定您希望使用辅助函数实现什么,但正如@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

此处X <<- M无需执行f1,尤其是如果您不想在内存中复制M