簡體   English   中英

理解嵌套函數的作用域

[英]Understanding scoping of nested functions

我試圖通過將腳本拆分為多個函數來重構腳本,具有主函數和“幫助函數”。 在這里,我偶然發現了一個問題,可以簡化為以下示例:

g <- function(a,b){       # help function
    a^2 + b^2 - c
}

f <- function(a,b,c,d){   # main function
    g(a,b)
}

這里的問題是, f無法計算,因為g不知道c是什么,但為什么會這樣呢?

我在這里讀到,如果 R 不知道函數中的變量/參數,它會在外部函數/環境中搜索缺少的變量/參數。

為什么g仍然不知道f聲明的值c

R使用詞法作用域這意味着如果一個函數需要引用該功能,它看起來在該函數被定義,而不是調用者的環境沒有定義的對象。 在問題中,g 是在全局環境中定義的,這就是 g 尋找 c 的地方。

另請注意,在 R 中,我們不會調用問題嵌套函數中的函數。 相反,嵌套的是調用,而不是函數。 在下面的 (3) 中,我們展示了嵌套函數。

1)我們可以重置一個函數的環境,在這種情況下它會認為它是在那個環境中定義的。

g <- function(a,b){       # help function
    a^2 + b^2 - c
}

f <- function(a,b,c,d){   # main function
    environment(g) <- environment()
    g(a,b)
}

f(1, 2, 3, 4)
## [1] 2

2)另一種可能性是使用envir$c(其中envir 是所需的環境)或get("c",envir) 或with(envir, c) 明確告訴它要搜索哪個環境。 環境 $c 將調查環境。 另外兩個將在那里查看,如果沒有找到,將查看祖先環境。 (每個環境都有一個父級或 emptyenv()。這與調用堆棧不同。)

g <- function(a, b, envir = parent.frame()){       # help function
    a^2 + b^2 - envir$c
}

f <- function(a,b,c,d){   # main function
    g(a,b)
}

f(1, 2, 3, 4)
## [1] 2

3)我們可以嵌套函數,以便在 f 中定義 g。

f <- function(a,b,c,d){   # main function
    g <- function(a,b){       # help function
        a^2 + b^2 - c
    }
    g(a,b)
}

f(1, 2, 3, 4)
## [1] 2

4)當然你可以通過 c 並避免所有這些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM