2017-09-13 1 views
0

Ich habe eine Funktion gemacht, die als Argument eine andere Funktion übernimmt, die Argumentfunktion nimmt als Argument ein Objekt (im Beispiel ein Vektor), das ist geliefert von der ursprünglichen Funktion. Es war schwierig, den Funktionsaufruf richtig zu machen. Im Folgenden sind drei Ansätze, die ich nach dem Lesen Programming with dplyr verwendet habe. Nur Option drei funktioniert,Auswerten einer Funktion, die ein Argument in einer anderen Funktion ist mit quo() in R

Ich würde gerne wissen, ob dies in der Tat der beste Weg ist, eine Funktion innerhalb einer Funktion zu bewerten.

library(dplyr);library(rlang) 
#Function that will be passed as an arguement 
EvaluateThis1 <- quo(mean(vector)) 
EvaluateThis2 <- ~mean(vector) 
EvaluateThis3 <- quo(mean) 

#First function that will recieve a function as an argument 
MyFunc <- function(vector, TheFunction){ 

    print(TheFunction) 
    eval_tidy(TheFunction) 
} 

#Second function that will recieve a function as an argument 
MyFunc2 <- function(vector, TheFunction){ 

    print(TheFunction) 
    quo(UQ(TheFunction)(vector)) %>% 
    eval_tidy 
} 

#Option 1 

#This is evaluating vector in the global environment where 
#EvaluateThis1 was captured 
MyFunc(1:4, EvaluateThis1) 

#Option 2 

#I don't know what is going on here 
MyFunc(1:4, EvaluateThis2) 
MyFunc2(1:4, EvaluateThis2) 
#Option 3 

#I think this Unquotes the function splices in the arguement then 
#requotes before evaluating. 
MyFunc2(1:4, EvaluateThis3) 

Meine Frage ist:

  1. Ist die Option 3 die beste/einfachste Weg, um diese Bewertung
  2. Eine Erklärung auszuführen, was

bearbeiten

geschieht Nach dem Lesen von @ Rui Barradas sehr klare und prägnante Antwort erkannte ich, dass ich tatsächlich versuche zu d o some ähnlich wie unter dem habe ich es nicht geschafft, Arbeit mit Rui Methode zu machen, aber gelöst Umgebung Einstellung

OtherStuff <-c(10, NA) 

EvaluateThis4 <-quo(mean(c(vector,OtherStuff), na.rm = TRUE)) 


MyFunc3 <- function(vector, TheFunction){ 
    #uses the captire environment which doesn't contain the object vector 
    print(get_env(TheFunction)) 

    #Reset the enivronment of TheFunction to the current environment where vector exists 
    TheFunction<- set_env(TheFunction, get_env()) 

    print(get_env(TheFunction)) 

    print(TheFunction) 
    TheFunction %>% 
    eval_tidy 
} 


MyFunc3(1:4, EvaluateThis4) 

Die Funktion innerhalb der aktuellen Umgebung nicht die Capture-Umgebung ausgewertet wird. Da in dieser Umgebung kein Objekt "OtherStuff" vorhanden ist, wird in den übergeordneten Umgebungen nach "OtherStuff" in der globalen Umgebung gesucht.

Antwort

3

Ich werde versuchen, auf Frage 1 zu beantworten.
Ich glaube, dass der beste und einfachere Weg, um diese Art der Auswertung durchzuführen ist, ohne irgendeine Art von ausgefallenen Auswertungstechniken zu tun. Normalerweise funktioniert die Funktion direkt. Versuchen Sie Folgendes anhand Ihres Beispiels.

EvaluateThis4 <- mean # simple 

MyFunc4 <- function(vector, TheFunction){ 
    print(TheFunction) 
    TheFunction(vector) # just call it with the appropriate argument(s) 
} 

MyFunc4(1:4, EvaluateThis4) 
function (x, ...) 
UseMethod("mean") 
<bytecode: 0x000000000489efb0> 
<environment: namespace:base> 
[1] 2.5 

Es gibt Beispiele dafür in der Basis R. Zum Beispiel approxfun und ecdf beide Rückkehr Funktionen, die Sie direkt in Ihrem Code verwenden können nachfolgende Berechnungen durchzuführen. Deshalb habe ich EvaluateThis4 so definiert.
Für Funktionen, die Funktionen als Argumente verwenden, gibt es die Optimierungen und natürlich *apply, by und ave.

Wie für Frage 2 muss ich zu meiner völligen Ignoranz zugeben.

+0

Danke für die Antwort nach dem Lesen Ich erkannte, dass ich meine Frage nicht gut genug gefragt hatte. Siehe die Änderung. Wenn es eine ähnliche Lösung wie Ihre erste gibt, wäre das großartig. Danke für die Hilfe –

Verwandte Themen