2017-12-24 4 views
1

Lassen Sie uns wir diese Funktion erklären soll:Variablen automatisch in R-Funktion Umgebung Injizieren

f <- function(x) u + x 

jetzt, wenn ich f(10) R rufen rekursiv für die übergeordnete Umgebung für einen Wert von u aussehen wird, bis er die globale Umwelt erreicht, wenn Ein Wert wird gefunden u + 10 wird zurückgegeben, sonst erhalten wir einen Fehler. So weit, ist es gut.

Jetzt haben wir einen Pool von wo wir die unbekannten Werte innerhalb des Körpers von f, wie pool <- list(u = 10) oder eine Umgebungsvariable mit u setzen möchten.

Wie würden Sie den Wert u einer generischen Funktion f injizieren? Können Sie eine Funktion schreiben, die die Variablen eingibt, die in pool innerhalb f definiert sind? Mit anderen Worten, können wir R in die Richtung zeigen, in der nach fehlenden Variablen gesucht wird, und stattdessen rekursiv in der übergeordneten Umgebung nachsehen?

EDIT: Ich weiß, dass ich das f <- function(x) pool[["u"]] + x natürlich tun kann, aber ich suche nach dem oben beschriebenen Verhalten.

BEARBEITEN: Der Anwendungsfall ist der folgende: Ich baue eine Bibliothek, die Benutzern ermöglicht, die Funktion zu konfigurieren, die sie optimieren möchten, und ich möchte, dass bestimmte Variablen verwendet werden, die bereits beim Laden der Bibliothek berechnet werden (Lösungen bestimmter Differentialgleichungen) und kombiniere sie, wie sie es wünschen. Deshalb möchte ich den Prozess so transparent wie möglich für sie machen und sie einen Variablenwert u anstelle von in den Körper der Funktion verwenden, wenn möglich.

+0

Sie würden das Objekt aufrufen, wo "u" gespeichert ist, nein? f <- function (x) pool [[""]] + x – InfiniteFlashChess

+0

Fragen Sie nach der gesamten Umgebung für Sie oder ob ein Objekt Sie enthält? – InfiniteFlashChess

+0

Siehe aktualisierte Frage – Batato

Antwort

2

1) zurückgesetzt Umgebungpool Konvertieren in eine Umgebung und setzt die Umgebung f es:

# inputs 
pool <- list(u = 10) 
f <- function(x) u + x 

environment(f) <- list2env(pool, parent = environment(f)) 
f(1) 
## [1] 11 

2) proto andere Möglichkeit ist das proto-Paket zu verwenden. Ein Proto-Objekt ist eine Umgebung mit modifizierten Methoden. Konvertieren Sie pool in ein Proto-Objekt p und fügen Sie darin f ein. Einfügen von f in p setzt seine Umgebung p so:

library(proto) 

p <- as.proto(pool, parent = environment(f)) 
p$f <- f 
with(p, f(10)) # use the version of f inserted into p 
## [1] 11 

oder wir könnten f mit der Version von f in p überschreiben:

library(proto) 

p <- as.proto(pool, parent = environment(f)) 
p$f <- f 
f <- with(p, f) 
f(1) 
## [1] 11 

Update: Set Mutter neuer Umgebung gebildet aus pool zur ursprünglichen Umgebung von f, so dass freie Variablen in f zuerst in der Umgebung gesucht werden, die ausgebildet wird 210 und dann f 's Umgebung in dieser Reihenfolge und nicht die Umgebung abgeleitet von pool und dann den übergeordneten Rahmen.

+0

Ich mag dies, es ist in der Linie, die ich ursprünglich dachte – Batato

+0

Ich habe gerade eingeloggt, um dies zu fragen :) danke! – Batato

Verwandte Themen