R中函数内'='和'<-'的作用域

时间:2019-01-22 09:13:08

标签: r

我试图了解R如何作用于函数内的变量。为什么输出为12?为什么不4?如何在这里分配a&b

我正在学习R。请提供一些参考资料

f1 <- function(a = {b <- 10; 2}, b = 2) {
  a+b
}

f1()

2 个答案:

答案 0 :(得分:3)

这在section 4.3.3 of the R Language manual中有解释。

  

在调用函数时,每个形式参数都被分配一个promise   在带有表达式插槽的调用的本地环境中   包含实际参数(如果存在)和环境插槽   包含呼叫者的环境。如果没有实际参数   调用中给出了正式参数,并且有一个默认值   表达式,它类似地分配给了   正式的论点,但环境设置为本地   环境。

     

通过评估承诺来填补承诺价值槽的过程   承诺环境中表达槽的内容称为   强迫诺言。一个承诺只会被强制一次,价值   广告位内容将在以后直接使用。

在开始计算总和之前,没有任何值。首先a是必需的,因此将对它的表达式求值。 b的承诺会丢失,因为在强制a期间直接为它分配了一个值,因此函数定义中的实际b分配承诺完全不会得到评估。

如果顺序相反,您会看到不同的结果:

f2 <- function(a = 2, b = {a <- 10; 2}) {
  a+b
}

f2()
[1] 4

但是,请注意,a的值在函数末尾将为10,但在求和期间需要为2。这两个承诺都在这里得到评估。

如果在f1中将总和的顺序颠倒为b+a,则会发现与f2类似的行为。

在该部分之前,有一个一般性警告,即在作业中应避免产生副作用,因为它们不能保证将对它们进行评估。

  

R具有对函数参数的惰性求值形式。争论是   直到需要时才进行评估。重要的是要意识到   在这种情况下,该参数将永远不会被评估。因此,   对函数使用参数会引起副作用。在C语言中   常见的使用形式foo(x = y)来调用y值为y的foo   同时将y的值赋给x相同的样式   不应在R中使用。不能保证该参数将   进行评估,因此分配可能不会发生。

答案 1 :(得分:1)

引用https://www.rdocumentation.org/packages/base/versions/3.5.2/topics/assignOps enter link description here

尝试

f1 <- function(a = {b <= 10; 2}, b = 2) {

  a+b
}

f1()

f1 <- function(a = {b <<- 10; 2}, b = 2) {

      a+b
    }

    f1()