R 3.1.0 - 不要理解这个功能是如何工作的

时间:2014-06-11 04:06:08

标签: r function

我正在学习如何在R中编程(这是我的第二个MOOC,首先是Python)。但我不知道这个功能是如何工作的。我已经尝试过论坛但尚未回答。请帮忙。

这是功能:

f <- function(x) {
        g <- function(y) {
                y + z
        }
        z <- 4
        x + g(x)
}

输入后的结果是什么:

z <- 10
f(3)

我的问题是:

1)变量“z&lt; -4”这是一个局部变量?我说“本地”因为我曾经在python中编写代码,而在这个langague中你有本地和全局变量。我不知道“R”是怎么回事。

2)我们对“y”没有任何价值。所以“y”被忽略为变量。但它被称为“功能”:g&lt; - function(y)。正确?

3)线条如何:“x + g(x)”有效吗?

我的意思是:a)首先,执行变量“g”。所以“y + z”已经完成......但是有多少值?我看到“z”在函数(y)用“}”结束后...所以“z&lt; -4”被视为“y + z”中“z”的值?或者不是?

请帮助。

3 个答案:

答案 0 :(得分:3)

z是函数f的本地。还有一个z在全球环境中宣布,但它对f的计算没有影响,只是试图让你失望;作业

z <- 10
在致电f之前

(或任何其他值)不会更改f(3)

yg的形式参数,将在需要时进行评估。

计算f(3)时,您将计算3 + g(3)z中未定义g,因此R会在下一个封闭环境中查找z为4. f(3) = 3 + 3 + 4 = 10.

答案 1 :(得分:1)

  1. 是的,你说'z'在某种程度上是一个局部变量是正确的。它在本地意义上说它不存在于声明的函数f之外,但另一方面它不是函数g的本地。这是R与Python略有不同的地方。您不需要将全局变量显式地引入声明的函数,它们可以在它下面的所有级别自动访问。现在,因为你定义'z'两次,一旦在'f'之内并且一次在'f'之外,R将在评估函数时使用最里面的'z',在这种情况下为4。

  2. 正如评论中所指出的,'y'只是函数'g'的参数。

  3. 在'x + g(x)'中,它与评论所说的完全相同。首先将'x'传递给函数'g',其中计算'x + z'。在这种情况下,声明函数'g'和变量'z'的顺序无关紧要,因为在声明'z'之前不会调用函数'g',并且正如我之前所说过的变量一样存在它可以被所有较低级别访问(即函数'g')。在计算'x + z'之后,将该和加回到'x'。所以我们得到了'f(3)','3 + 3 + 4 = 10'。

答案 2 :(得分:1)

这里的缺陷是要了解R如何决定从哪个环境中选择z的值。它将始终寻找本地环境,如果在本地环境中为z分配了一个值,它将选择该值。如果z未在本地环境中分配值,则R会查看下一个封闭的“更大”的本地环境。这个过程将重复进行,直到达到全球环境。

由于在z中调用g,因此R会在z中查找g的值,但无法找到它。然后R查看f的较少本地环境,其中z在调用g之前定义,因此使用该值z <- 4。在这种情况下,R永远不会查看全局作业z <- 10