我试图了解R如何作用于函数内的变量。为什么输出为12?为什么不4?如何在这里分配a&b
我正在学习R。请提供一些参考资料
f1 <- function(a = {b <- 10; 2}, b = 2) {
a+b
}
f1()
答案 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()