我是在R中创建函数的新手。我正在函数中构建一个算法并注意到一些奇怪的东西。以下是它的简化示例。
我有两个矩阵我想使用函数标量乘法。
A <- matrix(c(1,2,3,4,5,6,7,8,9),nrow=3,ncol=3)
matrix <- matrix(c(0,1,2,0,1,2,0,1,2),nrow=3,ncol=3)
我的功能:
Amatrix <- function(){
a_matrix <- A*matrix
}
调用该函数:
matrix_2 <- Amatrix()
输出:
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 2 5 8
[3,] 6 12 18
我的问题是,为什么我不需要将“A”和“矩阵”作为我的函数的参数?
假设即使函数不需要参数来按预期工作也是正确的,省略它们是不好的做法吗?
答案 0 :(得分:3)
Mongzyy,
为什么我不需要将“A”和“矩阵”作为我的函数的参数?
R等语言支持scope
的概念。在给出的示例中,变量A
和matrix
具有全局范围,因此可以在函数Amatrix
中看到。
通常,分配对象时并不重要。分配对象的位置很重要。同样重要的是评估函数时相关环境的状态。值得注意的是when
定义了一个函数,它被赋值给一个对象并被视为任何其他变量。
让我们看一个例子:
A <- matrix(c(1,2,3,4,5,6,7,8,9),nrow=3,ncol=3) # Global Scope
matrix <- matrix(c(0,1,2,0,1,2,0,1,2),nrow=3,ncol=3) # Global Scope
Amatrix <- function(){
matrix <- matrix(c(1,2,3,4,5,6,7,8,9),nrow=3,ncol=3) # Local Scope
a_matrix <- A*matrix # Global * Local Scope
}
matrix_2 <- Amatrix() # Returns Global*Local result
我们观察范围冲突的一个例子。 A
具有全球范围
函数matrix
中的Amatrix
被定义为具有局部范围。结果将结合全局A
和本地matrix
的组合,从而得到以下答案:
> matrix_2
[,1] [,2] [,3]
[1,] 1 16 49
[2,] 4 25 64
[3,] 9 36 81
>
而不是:
> matrix_2
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 2 5 8
[3,] 6 12 18
假设即使函数不需要参数来按预期工作也是正确的,省略它们是不好的做法吗?
通常,使用全局变量是不好的做法。在某些情况下,您需要全局变量,只需仔细步骤。
主要问题是跟踪全局变量何时以及如何变更以及由谁变更。考虑一下,如果你编写四个函数来访问你的数据,那么最后更新矩阵了吗?很难确切地知道。
如果你要并行运行你的程序,你会很快遇到问题,因为对全局数据结构的并行访问会产生一些非常新颖的问题。
我希望以上有所帮助。 小心