2012-10-02 5 views
6

Wie wird der Name der Umgebung innerhalb der Funktion als integrierte Funktionen angezeigt? Zum Beispiel, wenn ich die Funktion: mean im Basispaket verfügbar gebe, kann ich die Umgebung als "namespace: base" sehen.R: Funktionen - Anzeige des Umgebungsnamens anstelle der Speicheradresse dieser Umgebung?

mean 

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

Allerdings, wenn ich eine Funktion in die neu geschaffene Umgebung anhängen, hier die Werte für die freie Variable zuzugreifen (z) innerhalb der Funktion (f), es befindet sich automatisch in .GlobalEnv Umgebung und der Name Die Umgebung wird nicht in der Funktion angezeigt, aber die Speicheradresse "0x051abd60" der Umgebung (e1) wird angezeigt.

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

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

Warum sehe ich dieses Verhalten? Warum bekomme ich meinen Umgebungsnamen nicht innerhalb der Funktion als integrierte Funktionen von R und auch die Funktionen von verschiedenen R-Paketen? Gibt es einen Unterschied zwischen der Umgebungsdatenstruktur und der .GlobalEnv-Umgebung, die von search() verfügbar ist

Alle Hinweise auf die Motivation hinter diesem Verhalten würden sehr geschätzt.

Danke

Antwort

4

Wenn ich es richtig, Umwelt-Namen für Pakete erinnern und Namensräume sind an der C-Ebene zugeordnet. Daher werden von Benutzern erstellte Umgebungen keine Namen angezeigt. Sie können keinen Umgebungsnamen in R festlegen, obwohl eine (irreführend benannte) Basisfunktion namens environmentName() vorhanden ist. Es gibt nur den Namen zurück, der auf C-Ebene zugewiesen wurde. Es ist wirklich nur für Pakete und Namespaces gedacht, nicht für andere Umgebungen.

+0

Ich habe versucht, einen Namen für die Umwelt hinzuzufügen, um die environmentName (e1) mit <- "e1", bekam aber einen Fehler like "konnte die Funktion environmentName nicht finden ...". Außerdem hat jede Umgebung ein einzigartiges Profil für sie. Ich habe noch nicht mit Paketen gearbeitet, aber es ist interessant, das Verhalten von Namespaces zu kennen, die auf Variablen und ihre Datenstrukturen in R – Sathish

+0

angewendet werden. Haben Sie irgendeinen Zweck für die Funktion environmentName() erraten? – Sathish

3

Die meisten Umgebungen haben keine Namen - der Name einer Umgebung ist ein spezielles Attribut der Umgebung, nicht der Name des Objekts, das auf diese Umgebung verweist. Z.B. Was würden Sie im folgenden Fall von dem "Namen" der Umgebung von f erwarten?

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

Es gibt keinen Namen für die Umgebung von f, aber der Zeiger auf e1 oder e2 oder e3 wird ihm gegeben. – Sathish

+0

Mein Verständnis mit Umgebungen ist, dass es einige Umgebungen gibt, die ein "spezielles Attribut des Namens" haben. Zum Beispiel: Vordefinierte Umgebungen haben einen Namen, aber benutzerdefinierte Umgebungen erlauben es nicht, ein spezielles Namensattribut hinzuzufügen. Ich sehe jedoch keine spezielle Verwendung dieses speziellen Attributs für die benutzerdefinierten Umgebungen, da die Umgebungen mit anderen Objekten mit ihrem Objektnamen verknüpft sind und intern ein Zeiger für die Interaktion zwischen der Umgebung und dem zugeordneten Objekt zugewiesen ist. – Sathish

+0

Danke für deine Erklärung :) +1 – Sathish

0

Sie können einen Umgebungsnamen gesetzt attr verwenden, etwa so:

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

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