2016-11-17 4 views
1

Ich arbeite an einer Funktion, die sich ähnlich wie Reduce verhalten würde, wo Sie eine Funktion übergeben und über die Argumente versenden. Hier ist ein einfaches Beispiel, um zu zeigen, woran ich gerade arbeite.R - Konvertieren einer Funktion in String

Jetzt wird diese Arbeit offenbar nicht, wie es steht, weil switch eine character oder numericEXPR erfordert. Was ich nicht weiß, ist, die Funktion f, die an fun übergeben wird, in eine string umzuwandeln.

+0

Ich bin ein wenig unklar, was genau, Sie versuchen, hier zu tun, aber vielleicht 'match.fun () 'ist was du suchst? – joran

+0

@joran danke, aber das löst nicht das Problem, der gleiche Fehler wie oben. Ich will in diesem Fall die Funktion, "addition" zurückgeben, wo die 'switch' Anweisung auf die Funktion, die an sie übergeben wird. – cdeterman

+0

Ah, das war anscheinend das, was ich in meiner ursprünglichen Lektüre nicht verstand. – joran

Antwort

4

Ein Ansatz besteht darin, die Eingabe zu erfassen und den Aufruf zu trennen.

fun <- function(f){ 
    switch(deparse(substitute(f)), 
     `+` = "addition", 
     stop("undefined") 
) 
} 

fun(`+`) 
#[1] "addition" 
+0

Wahrscheinlich die beste Lösung. Meiner Kenntnis nach kann R zwei Funktionen nicht logisch vergleichen. Wenn Sie zum Beispiel 'my.fun <- mean 'zuweisen, funktioniert der Vergleich' my.fun == mean' nicht. – jdobres

+1

Sie können die Gleichheit der Funktionen 'identische (my.fun, mean) [1] TRUE' –

+0

Das löst es, danke. – cdeterman

-1

abgehend oberhalb von Pierre Kommentar kann man identical verwenden, um zu testen, ob zwei Funktionen die gleichen sind. Das funktioniert nicht gut mit switch, sondern eine if/else Baum ist noch relativ einfach:

fun <- function(f) { 
    if (identical(f, `+`)) { 
     return('addition') 
    } else if (identical(f, mean)) { 
     return('mean') 
    } else { 
     return('undefined') 
    } 
}