我可以解釋行爲,但不知道解決問題的正確方法是什麼(環境會讓我的頭部受傷)。
問題是您的匿名函數會提取一個環境。它會在其中查找對象的環境,包括instList
。在第一次迭代中,它獲得這種環境<environment: 0x28e19a8>
,這是你的函數當前環境正在評估(assign.instrumentslist()
):
Browse[2]> environment()
<environment: 0x28e19a8>
在循環的下一次迭代的instList
在目前的環境<environment: 0x28e19a8>
值變更爲"HO"
。現在test.CL()
和test.HO()
都具有相同的環境,因此請參閱相同的instList
,該值現在具有值"HO"
。在test.GC()
的最後一次迭代中發生同樣的事情。下面的調試記錄表明這樣的:
debug at #5: assign(paste("test", instList, sep = "."), function() {
print(instList)
}, envir = .GlobalEnv)
Browse[2]>
debug at #3: instList
Browse[2]> environment(test.CL)
<environment: 0x28e19a8>
Browse[2]> eval(instList, environment(test.CL))
[1] "CL"
Browse[2]>
debug at #5: assign(paste("test", instList, sep = "."), function() {
print(instList)
}, envir = .GlobalEnv)
Browse[2]>
debug at #3: instList
Browse[2]> environment(test.CL)
<environment: 0x28e19a8>
Browse[2]> eval(instList, environment(test.CL))
[1] "HO"
當循環結束後,的assign.instrumentslist()
,<environment: 0x28e19a8>
評價環境中,仍然存在,因爲它也是你的三個功能環境。它們都指向相同的環境,並使用在循環的最後一次迭代期間設置的值instList
。
+1因爲它有效,但你應該因爲把它放在這裏而受到懲罰! ;-) – 2012-03-21 09:10:58
請保持它自己;-p – kohske 2012-03-21 09:13:51
Thx爲您的幫助!奧利維爾 – user1281273 2012-03-21 09:46:06