2013-10-03 45 views
2

我運行下面的代碼什麼功能LS()中的R爲環境做

sapply(0:3, function(x){ls(envir = sys.frame(x))}) 

,並得到以下結果

[[1]] 
[1] "mat"   "mat_inverse" 

[[2]] 
[1] "FUN"  "simplify" "USE.NAMES" "X"   

[[3]] 
[1] "FUN" "X" 

[[4]] 
[1] "x" 

好像它會列出當前的所有對象封閉環境;我有mat和mat_inverse作爲兩個變量。但我不確定[[2]],[[3]],[[4]]返回的是什麼。有沒有辦法調試這段代碼來跟蹤這段代碼的作用?特別是以下部分:

envir = sys.frame(x) 

對我來說很混亂。

+0

只需在命令提示符下敲入沒有括號或參數的函數並按ENTER(即'> ls'),就可以獲得函數的代碼。請注意,您將'ls()'應用於'0:4'的'sys.frame'環境,這就是爲什麼您得到返回的長度爲4的列表。 – gung

+0

謝謝你的迴應。 envir = sys.frame(x))是做什麼的? –

+0

我不確定;這不是我所處理過的。從文檔中,'sys.frame()'允許你訪問不同的環境,w /'0'是堆棧的最頂層。也許其他人更瞭解這一點。更重要的是,你爲什麼運行這個代碼?你想要達到什麼目標? – gung

回答

3

sys.frame允許您返回調用堆棧。 sys.frame(0)是堆棧的開始(您的初始工作空間,可以這麼說)。 sys.frame(1)嵌套一級深度,sys.frame(2)嵌套兩級深度等。

此代碼很好地演示了當您撥打sapply時發生的情況。它通過四個環境(編號0-3)並打印每個對象。 sapply實際上是lapply的包裝。實際調用此代碼時,您獲得了哪些環境?

環境0是開始,即您的整個工作區。 環境1是sapply。輸入sapply以查看其代碼。你會看到函數頭有simplify,你在[[2]]中看到的變量之一。 環境2是lapply。再次輸入lapply以查看其代碼;功能標題包含FUNX。 環境3是您爲sapply運行而定義的功能。它只有一個變量,x

作爲一個實驗,運行

sapply(0:3, function(x) { howdy = 5; ls(envir = sys.frame(x)) }) 

最後一行將變更爲[1] "howdy" "x",因爲你最終的環境(內部sapplylapply功能)中定義一個新的變量。

+0

所以答案是ls()_除了吐出指定對象的字符表示外,沒有其他任何環境。 –

+0

這確實是ls()函數,列出當前環境中的所有對象。 envir參數表示不同的環境。 –