我正在学习如何在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”的值?或者不是?
请帮助。
答案 0 :(得分:3)
z
是函数f
的本地。还有一个z
在全球环境中宣布,但它对f
的计算没有影响,只是试图让你失望;作业
z <- 10
在致电f
之前(或任何其他值)不会更改f(3)
。
y
是g
的形式参数,将在需要时进行评估。
计算f(3)
时,您将计算3 + g(3)
。 z
中未定义g
,因此R会在下一个封闭环境中查找z
为4. f(3) = 3 + 3 + 4 = 10.
答案 1 :(得分:1)
是的,你说'z'在某种程度上是一个局部变量是正确的。它在本地意义上说它不存在于声明的函数f之外,但另一方面它不是函数g的本地。这是R与Python略有不同的地方。您不需要将全局变量显式地引入声明的函数,它们可以在它下面的所有级别自动访问。现在,因为你定义'z'两次,一旦在'f'之内并且一次在'f'之外,R将在评估函数时使用最里面的'z',在这种情况下为4。
正如评论中所指出的,'y'只是函数'g'的参数。
在'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
。