可以在R中的函数内修改非全局变量吗?

时间:2016-07-05 05:49:39

标签: r

我在理解R的语义和语法方面遇到了很多麻烦。在我看来,局部变量无法在函数内部进行修改。

例如,在这个基本代码中,我希望heatmap.matrix变量在我调用foo()函数时得到更新。

heatmap.matrix <- matrix(rep(0,40000), nrow=200, ncol=200)

# foo function should just update a single cell of the declared matrix
foo <- function() { heatmap.matrix[40,40] <- 100}

heatmap.matrix[40,40]
[1] 0
foo()
heatmap.matrix[40,40]
[1] 0
# there I expected it to return 100.  Yet if I do it out of the function:
heatmap.matrix[40,40] <- 100
[1] 100

这让我相信在函数求值之后,范围的变量不会被传回。 是R的情况吗?还有其他事情发生吗?我觉得我真的不知道发生了什么。真的很感激任何帮助/见解!

为了给出快速解释,在我的代码中,我有一个包含xy列的频率表,我正在尝试将其转换为具有相应值的二维矩阵输入频率表,如果没有相应的输入则为零。但是,我无法在apply函数中修改矩阵。

1 个答案:

答案 0 :(得分:1)

可以使用getassign函数在函数中更新全局变量。下面是代码,它们也是如此:

heatmap.matrix <- matrix(rep(0,40000), nrow=200, ncol=200)

# foo function should just update a single cell of the declared matrix
varName <- "heatmap.matrix" 
foo <- function() { 
  heatmap.matrix.copy <- get(varName)
  heatmap.matrix.copy[40,40] <- 100
  assign(varName, heatmap.matrix.copy, pos=1)
}

heatmap.matrix[40,40]
#[1] 0
foo()
heatmap.matrix[40,40]
# [1] 100

你应该阅读一下环境概念。最好的起点是http://adv-r.had.co.nz/Environments.html