gpt4 book ai didi

r - R 怎么知道不使用旧的 'f' ?

转载 作者:行者123 更新时间:2023-12-04 21:56:10 26 4
gpt4 key购买 nike

进入 R 控制台,输入:

#First code snippet
x <- 0
x <- x+1
x

你会得到“1”。这是有道理的:这个想法是 'x+1' 中的 'x' 是 x 的当前值,即 0,这用于计算 x+1 的值,即 1,然后将其铲入容器 x。到现在为止还挺好。

现在输入:
#Second code snippet
f <- function(n) {n^2}
f <- function(n) {if (n >= 1) {n*f(n-1)} else {1}}
f(5)

你会得到'120',这是5阶乘。

我觉得这很令人困惑。按照第一个代码片段的逻辑,我们可能期望表达式中的“f”
if (n >= 1) {n*f(n-1)} else {1}

被解释为 f 的当前值,即
function(n) {n^2}

按照这个推理,f(5) 的值应该是 5*(5-1)^2 = 80。但这不是我们得到的。

Question. What's really going on here? How does R know not to use the old 'f'?

最佳答案

we might expect the 'f' in the expression

if (n >= 1) {n*f(n-1)} else {1}

to be interpreted as the current value of f


— 是的,我们可能会期待这一点。我们会是正确的。
但是什么是“ f的当前值”? ”?或者,更准确地说,什么是“当前”?
“当前”是执行函数的时间 ,而不是在定义时。也就是说,到您执行 f(5) 时,它已经被重新定义。所以现在执行进入函数,在函数里面查找什么 f指的是 - 并且还可以找到当前(= 新)定义,而不是旧定义。
换句话说:与名称关联的对象在实际访问时被查找。在函数内部,这意味着在函数执行时访问名称,而不是在定义时访问。
对于所有对象也是如此。比方说 f正在使用一个不是函数的全局对象:
n = 5
f = function() n ^ 2

n = 1
f() # = 1

要了解您的第一个和第二个示例之间的区别,请考虑以下涉及函数的案例,但其行为与您的第一个案例相似(即它使用 f 的“旧”值)。
为了使示例工作,我们需要一个小 helper :一个修改其他函数的函数。以下, twice是一个函数,它接受一个函数作为参数并返回一个新函数。该新函数与旧函数相同,只是在调用时运行了两次:
twice = function (original_function) {
force(original_function)
function (...) {
original_function(original_function(...))
}
}
说明什么 twice确实,让我们在示例函数上调用它:
plus1 = function (n) n + 1
plus2 = twice(plus1)
plus2(3) # = 5
整洁——R 允许我们像处理任何其他对象一样处理函数!
现在让我们修改您的 f :
f = function(n) {n^2}
f = twice(f)
f(5) # 625
……我们有了它:在声明 f = twice(f) 中,第二个 f指当前(=旧)定义。只有在该行之后 f请参阅新的、修改过的功能。

关于r - R 怎么知道不使用旧的 'f' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37971361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com