Anhängen eines temporären Namespaces an den Suchpfad

Diese Frage ist eine Art FolgemaßnahmePost Da ich immer noch nicht ganz davon überzeugt bin, dass es in Bezug auf die Robustheit des Codes nicht viel besser wäre, zu tippennamespace::foo() Angewohnheit, anstatt nur zu tippenfoo() und betend bekommst du das gewünschte ergebnis ;-)

Aktuelle Frage

Ich bin mir bewusst, dass dies stark gegen "Standard-R-Konventionen" verstößt, aber sagen wir einfach, ich bin neugierig ;-)Ist es möglich, einen temporären Namespace an den Suchpfad anzuhängen?

Motivation

An einem Punkt, an dem mein Paketmypkg ist noch in "Entwicklungsphase"(d. h.Noch kein echtes R-Paket):

Ich möchte meine Funktionen in eine Umgebung einbindenmypkg anstatt.GlobalEnvdann befestigenmypkg zum Suchpfad (wenn möglich als echter Namespace)um anrufen zu könnenmypkg::foo()

Mir ist diese Berufung durchaus bewusst:: hat seine Nachteile (es dauert länger, als nur den Namen einer Funktion einzugeben und R die Suche implizit ausführen zu lassen) und / oder wird aufgrund der Art und Weise möglicherweise nicht als notwendig erachtetein) R durchsucht den Suchpfad undb) Pakete können ihre Abhängigkeiten importieren (d. h. "Imports" anstelle von "Depends" verwenden, bestimmte Funktionen usw. nicht exportieren). Aber ich habe gesehen, dass mein Code mindestens zweimal abgestürzt ist, weil einige Pakete bestimmte (Basis-) Funktionen überschrieben haben. Deshalb bin ich von "blind trust" in den "better-to-be-safe-than-sorry" -Modus übergegangen. -)

Was ich versucht habe

AFAIU, Namespaces sind im Prinzip nichts anderes als eine spezielle Art von Umgebung

> search()
[1] ".GlobalEnv"        "package:stats"     "package:graphics" 
[4] "package:grDevices" "package:utils"     "package:datasets" 
[7] "package:methods"   "Autoloads"         "package:base"     

> asNamespace("base")
<environment: namespace:base>

Und da ist derattach() Funktion, die Objekte an den Suchpfad anfügt. Also hier ist was ich dachte:

temp.namespace <- new.env(parent=emptyenv())
attach(temp.namespace)
> asNamespace("temp.namespace")
Error in loadNamespace(name) : 
  there is no package called 'temp.namespace'

Ich muss wohl irgendwie damit arbeitenattachNamepace() und herauszufinden, was dies erwartet, bevor es in aufgerufen wirdlibrary(). Irgendwelche Ideen?

BEARBEITEN

Zu Hadleys Kommentar: Es ist mir eigentlich egal, ob die angehängte Umgebung ein ausgewachsener Namespace ist oder nur eine normale Umgebung, solange ich sie erweitern kann:: unter Beibehaltung der "syntaktischen sugering" -Funktion (d. h. anrufen könnenpkg::foo() anstatt"::"(pkg="pkg", name="foo")()).

So funktioniert es"::" sieht aus wie:

> get("::")
function (pkg, name) 
{
    pkg <- as.character(substitute(pkg))
    name <- as.character(substitute(name))
    getExportedValue(pkg, name)
}

Dies sollte es auch tun können, falls R dies erkenntpkg ist in der Tatnicht Ein Namespace, aber nur eine Umgebung, die an den Suchpfad angehängt ist:

"::*" <- function (pkg, name) 
{
    pkg <- as.character(substitute(pkg))
    name <- as.character(substitute(name))
    paths <- search()
    if (!pkg %in% paths) stop(paste("Invalid namespace environment:", pkg))
    pos <- which(paths == pkg)
    if (length(pos) > 1) stop(paste("Multiple attached envirs:", pkg))
    get(x=name, pos=pos)
}

Es funktioniert, aber es gibt kein syntaktisches Sugaring:

> "::*"(pkg="tempspace", name="foo")
function(x, y) x + y
> "::*"(pkg="tempspace", name="foo")(x=1, y=2)
[1] 3

Wie könnte ich anrufen?pkg::*foo(x=1, y=2) (Ungeachtet der Tatsache, dass::* ist ein wirklich schlechter Name für eine Funktion ;-))?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage