函数的参数

时间:2016-05-20 06:30:43

标签: r function arguments

我是在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”和“矩阵”作为我的函数的参数?

假设即使函数不需要参数来按预期工作也是正确的,省略它们是不好的做法吗?

1 个答案:

答案 0 :(得分:3)

Mongzyy,

  

为什么我不需要将“A”和“矩阵”作为我的函数的参数?

R等语言支持scope的概念。在给出的示例中,变量Amatrix具有全局范围,因此可以在函数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
  

假设即使函数不需要参数来按预期工作也是正确的,省略它们是不好的做法吗?

通常,使用全局变量是不好的做法。在某些情况下,您需要全局变量,只需仔细步骤。

主要问题是跟踪全局变量何时以及如何变更以及由谁变更。考虑一下,如果你编写四个函数来访问你的数据,那么最后更新矩阵了吗?很难确切地知道。

如果你要并行运行你的程序,你会很快遇到问题,因为对全局数据结构的并行访问会产生一些非常新颖的问题。

我希望以上有所帮助。 小心