2016-04-17 3 views
1

Ich habe eine Funktion, die braucht, um eine formula als Eingabe, zum Beispiel in Form von y~x zu erwarten. Dann muss ich eine Reihe von x-values in diese Formel übergeben, um die y herauszuholen.Wie man Formel in Funktion umwandelt oder die Formel auf einige Werte anwendet?

Zum Beispiel, wenn meine Formel y~x^2 ist, und meine Reihe von x-Werten ist (1,2,3,4), dann sollte ich (1,4,9,16) als Ausgabe erwarten.

sagen, dass ich die Formel wie folgt aus: formula1 <- y~x:

Hier ist, was ich bisher ausprobiert habe: as.function(formula1)

  • Mit model.frame und model.matrix wie so:

    • die Formel in eine Funktion umwandeln :

    so:

    • Ich versuchte NLS2 verwenden, aber ich habe keine Parameter zu optimieren, so dass ich nicht den Punkt sehen.

    Was kann ich dafür verwenden?

    Hier sind die Ressourcen, die ich konsultiert:
    How to apply a formula to a vector in R?

    Pass formula to function in R?

  • Antwort

    1

    Ich bin nicht sicher, ob dies der eleganteste Weg ist, aber es sollte tun, wie Sie benötigen:

    Die Idee ist, um die rechte Seite des Formelobjekts zu extrahieren und als String zu analysieren. Das Ergebnis kann dann ausgewertet werden.

    as.function <- function(formula) { 
        cmd <- tail(as.character(formula),1) 
        exp <- parse(text=cmd) 
        function(...) eval(exp, list(...)) 
    } 
    

    ist jedoch zu beachten, dass es gültige Formeln sind, die zum Beispiel y ~ a:c können nicht auf diese Weise ausgewertet werden.

    die uns

    > f <- as.function(y ~ x^2) 
    > f(x=1:10) 
    [1] 1 4 9 16 25 36 49 64 81 100 
    

    gibt Wenn Sie eine data.frame auf die generierte Funktion verfassen könnten Sie einfach

    as.function <- function(formula) { 
        cmd <- tail(as.character(formula),1) 
        exp <- parse(text=cmd) 
        function(df) eval(exp, df) 
    } 
    

    tun und

    > f <- as.function(y ~ x^2) 
    > f(data.frame(x=1:10)) 
    [1] 1 4 9 16 25 36 49 64 81 100 
    
    +0

    erhalten, die raffinierte ist. Danke. – Candic3