我正在研究 R 環境,但我在閱讀 Hadley Wickham 的“高級 R”一書時遇到了一個問題。是否可以使函式的執行環境永久化?
我將嘗試解釋我的問題的原因。
當 Wickham 解釋函式的執行環境如何作業時,顯示了以下示例:
j <- function() {
if (!exists("a")) {
a <- 1
} else {
a <- a 1
}
print(a)
}
j()
我已經理解為什么每次j呼叫函式時回傳的值都是 1。在文本的另一部分,他說:
當你在另一個函式內部創建一個函式時,子函式的封閉環境是父函式的執行環境,執行環境不再是短暫的。
所以我想創建以下函式:
j <- function() {
if (!exists("a")) {
a <- 1
} else {
a <- a 1
}
print(a)
g <- function() {}
g()
}
j()
但是回傳值總是1,所以我猜是因為每次都繼續銷毀執行環境。“不再短暫”是什么意思?
uj5u.com熱心網友回復:
基于這本書,還可以使用函式工廠結構(創建另一個函式的函式)來捕獲第一個函式的臨時執行環境。以下示例只是我們如何捕獲它的一種簡單方法:
library(rlang)
j <- function() {
print(current_env())
a <- 1
k <- function() {
if (!exists("a")) {
a <- 1
} else {
a <- a 1
}
print(a)
}
}
plus <- j()
> plus <- j()
<environment: 0x000001ca98bc1598>
現在無論你使用函式多少次plus,它的環境永遠是第一個函式的執行環境:
library(rlang)
env_print(plus)
<environment: 000001CA98BC1598>
parent: <environment: global>
bindings:
* k: <fn>
* a: <dbl>
plus()
[1] 2
env_print(plus)
<environment: 000001CA98BC1598>
parent: <environment: global>
bindings:
* k: <fn>
* a: <dbl>
我希望這在某種程度上回答了您的問題,但也可能有更好的答案。
uj5u.com熱心網友回復:
函式內的永久環境稱為“閉包”。這里有一個玩具示例來演示這一點。檢查它,然后相應地修改您的代碼。
closure <- function(j) {
i <- 1
function(x) {
i <<- i 1
j * i x
}
}
i <- 12345
instance <- closure(11)
instance(3)
#[1] 25
instance(3)
#[1] 36
instance(3)
#[1] 47
otherObj <- closure(2)
otherObj(3)
#[1] 7
instance(2)
#[1] 57
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364521.html
下一篇:檢測數字是否為階乘遞回
