2017-01-16 3 views
9

Ich dachte, dass es ausreichen würde, voll qualifizierte Namen zu verwenden, um zu vermeiden, meinen Umfang mit Namen zu verschandeln, die ich nicht explizit eingeführt habe, aber anscheinend ist dies bei R nicht der Fall.R Wie schränkt man die Namen ein, die sich im Geltungsbereich befinden, auf diejenigen, die ich explizit erstelle?

Zum Beispiel

% R_PROFILE_USER= /usr/bin/R --quiet --no-save --no-restore 
> ls(all = TRUE) 
character(0) 
> load("/home/berriz/_/projects/fda/deseq/.R/data_for_deseq.RData") 
> ls(all = TRUE) 
[1] "a" "b" "c" 
> ?rlog 
No documentation for ‘rlog’ in specified packages and libraries: 
you could try ‘??rlog’ 

So weit, so gut. Wie der letzte Befehl zeigt, weiß der Interpreter insbesondere nichts von rlog.

Aber nachdem ich laufen

> d <- DESeq2::DESeqDataSetFromMatrix(countData = a, colData = b, design = c) 

... dann, von nun an, der Befehl ?rlog eine Dokumentationsseite für eine Funktion erzeugen habe ich nicht explizit in die Umwelt einzuführen (und beziehen sich nicht mit einem vollständig qualifizierter Name).

Ich finde dieses Verhalten beunruhigend.

Insbesondere weiß ich nicht, wann eine Definition, die ich explizit gemacht habe, stillschweigend als Nebeneffekt eines scheinbar unzusammenhängenden Befehls beschattet wird.

Wie kann ich kontrollieren, was die Umgebung sehen kann?

Oder anders gesagt, wie kann ich Nebenwirkungen wie die oben abgebildete verhindern?

+2

Von '\' :: \ '': „Das Paket Namespace geladen werden, wenn sie nicht vor dem Aufruf geladen wurde, aber das Paket wird nicht an den Suchpfad angebracht werden“ – alistaire

+0

@alistaire: Danke für die Beruhigung. Das wird etwas gewöhnungsbedürftig sein ... Überall sonst bin ich auf die Idee eines Suchpfads gestoßen, das bedeutet, dass ein nicht qualifizierter Bezeichner, der nicht über den Suchpfad gefunden werden kann, nicht definiert ist, Punkt.In meinem Beispiel ist 'rlog' jedoch weder ein qualifizierter Bezeichner, noch ist er, wie Ihr Auszug zeigt, über den Suchpfad erreichbar, und der R-Interpreter behandelt ihn nicht als ungültig. – kjo

+6

Es gibt tatsächlich ein paar Suchpfade; Die hier relevanten sind geladene Namespaces und angehängte Namespaces. Sofern keine Paketreferenz vorangestellt ist, können Sie nur Funktionen aufrufen, die sich in einem angehängten Namespace befinden. Was normalerweise geladen wird, spielt keine große Rolle. '?' Ist jedoch gierig und durchsucht alle geladenen Namespaces. '??' ist noch gieriger und durchsucht alle installierten Pakete. – alistaire

Antwort

1

Nicht sicher, ob "scope" in R dasselbe bedeutet wie in anderen Sprachen. R verwendet "Umgebungen" (siehe http://adv-r.had.co.nz/Environments.html für detaillierte Erklärung). Ihr Bereich in R enthält alle Umgebungen, die geladen werden, und wie Sie festgestellt haben, steuert der Benutzer nicht explizit alle geladenen Umgebungen.

Zum Beispiel

ls() 

listet die Objekte in der Standardumgebung

'.GlobalEnv'
search() 

listet die aktuell geladenen Umgebungen.

ls(name='package.stats') 

In Standard-R-Installationen ist "Paket: Statistiken" eine der beim Start geladenen Umgebungen.

Standardmäßig wird alles, was Sie erstellen, in der globalen Umgebung gespeichert.

Sie können explizit auf Objekte verweisen, die Sie erstellen, indem Sie ihre Umgebung mit der $ -Syntax referenzieren.

x <- c(1,2,3) 
.GlobalEnv$x 
Verwandte Themen