[英]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.