【问题标题】:Lexical scoping and the <<- operator in RR中的词法作用域和<<-运算符
【发布时间】:2017-03-03 16:47:48
【问题描述】:

此代码出现在 Intro to R 手册中。

open.account <- function(total) {
    list(deposit = function(amount) {
        if (amount <= 0) stop("Deposits must be positive!\n")
        total <<- total + amount
        cat(amount, "deposited.  Your balance is", total, "\n\n")
    }, withdraw = function(amount) {
        if (amount > total) stop("You don’t have that much money!\n")
        total <<- total - amount
        cat(amount, "withdrawn.  Your balance is", total, "\n\n")
    }, balance = function() {
        cat("Your balance is", total, "\n\n")
    })
}

这应该模拟银行账户的运作方式,在记录存款和取款的同时跟踪运行余额。为了做到这一点,程序需要在每次交易之前查看余额,这是动态的,因此不能用函数定义。这是我有点模糊的地方......

我的问题是关于&lt;&lt;- 运算符,它允许函数在环境之外索引total 的值。

词法作用域的规则规定变量或对象的值是在它们被定义的环境中确定的。这决定了在哪里 r 应该看,而不是何时

话虽如此,当我们使用&lt;&lt;- 运算符指向当前环境之外的值时,它指向哪里?这是一个概念性问题,让我无法完全理解它是如何工作的。我了解代码是如何工作的,但我不确定当我们使用 &lt;&lt;- 运算符时该值是从哪里提取的。

【问题讨论】:

  • 来自`help("<<-"),它会导致“通过父环境进行搜索......否则在全局环境中进行分配。”这是您的意思吗?
  • 即在当前环境中查找,然后是立即调用函数的环境,然后是它的调用环境,等等,直到它到达.GlobalEnv。如果没有找到,它会在.GlobalEnv 中分配一个新变量。

标签: r lexical-scope


【解决方案1】:

操作符‘>’通常只用在函数中, 并通过父环境搜索 正在分配的变量的现有定义。如果这样一个 找到变量(并且它的绑定没有被锁定)然后它的值 被重新定义,否则分配发生在全局 环境

全局变量

z <- 10

不修改z的全局值

myfun <- function(x){
 z <- x
print(z)
}

在 myfun 中修改 z 的值,但不要在全局级别修改 z。

    myfun0 <- function(x){
     z <- x
       myfun1 <- function(y){
         z <<- (y+1)
}

  myfun1(x)
    print(z)
         }

在全局环境中修改z

myfunG <- function(x){
z <<- x
print(" z in the global envronment is modified")
}

参见this 帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-26
    • 2018-02-26
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多