你的編碼方式與功能範例非常相似。 R更經常用作腳本語言。所以,除非你確切地知道你在做什麼,這是不好的做法是使用< < - 或包括在函數的函數。
您可以在功能環境章節找到解釋here。
環境是一個空間/幀在那裏執行代碼。環境可以嵌套,就像功能一樣。
創建功能時,您有附加的機櫃環境,可由environment
調用。這是封閉的環境。
該函數在另一個環境中執行,執行環境採用全新的啓動原則。執行環境是封閉環境的子環境。
對於爲例,我的筆記本電腦:
> environment()
<environment: R_GlobalEnv>
> environment(f$increment)
<environment: 0x0000000022365d58>
> environment(f$get_i)
<environment: 0x0000000022365d58>
f是位於全球環境的對象。
功能increment
貼有封閉環境0x0000000022365d58,函數factory
的執行環境。
我從哈德利引用:
當另一個函數內部創建一個函數,封閉 環境中的孩子的功能是 父的執行環境,執行環境不再是短暫的。
執行函數f時,將使用其中的my_list
對象創建封閉環境。
可與ls
命令進行評估:
> ls(envir = environment(f$increment))
[1] "my_list"
> ls(envir = environment(f$get_i))
[1] "my_list"
的<<-
運營商在父母搜索環境中使用的變量。在這種情況下,找到的my_list
對象是緊鄰上層環境中的對象,它是該函數的封閉環境。
因此,當增量作出時,它只在該環境中而不在全局中。
您可以通過在更換increment
功能看它:
my_list$increment <- function() {
print("environment")
print(environment())
print("Parent environment")
print(parent.env(environment()))
my_list$i <<- my_list$i + 1
}
它給我:
> f$increment()
[1] "environment"
<environment: 0x0000000013c18538>
[1] "Parent environment"
<environment: 0x0000000022365d58>
您可以使用get
來訪問你的結果,一旦你已經存儲環境名稱:
> my_main_env <- environment(f$increment)
> get("my_list", env = my_main_env)
$i
[1] 2
$increment
function()
{
print("environment")
print(environment())
print("Parent environment")
print(parent.env(environment()))
my_list$i <<- my_list$i + 1
}
<environment: 0x0000000022365d58>
$get_i
function()
{
print("environment")
print(environment())
print("Parent environment")
print(parent.env(environment()))
my_list$i
}
<environment: 0x0000000022365d58>
來源
2017-06-29 12:47:16
YCR
是不是你只是改變'my_list $ i'的值而不是'f $ i'的值?這些不是同一個變量。如果'my_list'存在於全局環境中,它的'i'參數會被改變,但是你不會改變'f'對象的任何項目 – Cath
謝謝 - 是的,它們不是同一個變量,這是令人驚訝的。 我猜我試圖理解_why_他們不是同一個變量。我們在R中看到的行爲與JavaScript中發生的行爲不同。 – RobinL
對不起,這是微不足道的答案,但我仍然認爲這是它的原因:它只是不同的名稱(儘管兩個「代表」相同的變量) – Cath