2012-10-02 90 views
6

與內置函數一樣,在函數內部顯示環境的名稱的方法是什麼?例如,當我鍵入基本包中的函數:mean時,我可以將環境看作「namespace:base」。R:函數 - 顯示環境名稱而不是該環境的內存地址?

mean 

    function (x, ...) 
    UseMethod("mean") 
    <bytecode: 0x0547f17c> 
    **<environment: namespace:base>** 

然而,當我附上一個功能到新創建的環境,這裏訪問函數內的自由變量(Z)的值(F),它會自動駐留在.GlobalEnv環境和名稱該功能內部不顯示環境,但可以看到(e1)環境的存儲器地址「0x051abd60」。

 e1 <- new.env() 
    e1$z <- 10 
    f <- function(x) { 
      x + z 
     } 
    environment(f) = e1 
    f 

       function(x) { 
        x + z 
       } 
       **<environment: 0x051abd60>** 

爲什麼我會看到這種行爲?爲什麼我不能像R的內置函數一樣在函數內部獲取我的環境名稱,以及各種R包中提供的函數?環境數據結構和搜索環境中可提供的環境數據結構是否存在差異

任何指向此行爲背後動機的指針都將受到高度讚賞。

謝謝

回答

4

如果我沒有記錯,用於封裝環境的名稱和命名空間在C級別分配。所以用戶創建的環境不會顯示名稱。即使存在名爲environmentName()的基準函數(誤導性名稱),也不能在R中設置環境名稱。它只會返回C級分配的名稱。它實際上僅用於包和命名空間,而不是其他環境。

+0

我嘗試將名稱添加到使用environmentName(E1)環境< - 「E1」,卻得到了一個錯誤像「找不到功能environmentName ...」。另外,每個環境都有獨特的配置文件。我還沒有使用過軟件包,但瞭解R – Sathish

+0

中變量及其數據結構的命名空間行爲是否值得你猜對於environmentName()函數有什麼作用? – Sathish

3

大多數環境沒有名稱 - 環境的名稱是環境的特殊屬性,而不是指向該環境的對象的名稱。例如。在下面的情況下,你會期望f的環境的「名稱」是什麼?

e1 <- new.env() 
e1$z <- 10 
e2 <- e1 
e3 <- e1 

f <- function(x) { 
    x + z 
} 
environment(f) <- e1 

identical(e1, e2) 
identical(e1, e3) 
+0

f的環境沒有名稱,但指向e1或e2或e3的指針已賦給它。 – Sathish

+0

我對環境的理解是,有些環境具有「名稱的特殊屬性」。例如:內置環境帶有名稱,但用戶定義的環境不允許爲其添加名稱特殊屬性。雖然,我沒有看到具有這種特殊屬性的用戶定義環境的具體用法,因爲環境以其對象名稱鏈接到其他對象,並且在內部指定了一個指針以在環境與其分配的對象之間進行交互。 – Sathish

+0

感謝您的解釋:) +1 – Sathish

0

您可以設置使用attr環境的名稱,像這樣:

e <- new.env() 
attr(e, "name") <- "xyzzy" 

environmentName(e) 
## [1] "xyzzy"