2012-04-04 8 views
3

Ich versuche, eine let Funktion zu schreiben, die mir Dinge wie zu tun erlaubt:Wie emuliert Lisp die Let-Funktion in R?

let(a=2, b=3, a+b) 
>>> 5 

Derzeit stecken Ich bin mit

let <- function(..., expr) { 
    with(list(...), quote(expr)) 
} 

, die überhaupt nicht funktionieren. Jede Hilfe wird geschätzt.

Antwort

11

Hier ist eine Möglichkeit:

let <- function(..., expr) { 
    expr <- substitute(expr) 
    dots <- list(...) 
    eval(expr, dots) 
} 

let(a = 2, b = 3, expr = a+b) 
# [1] 5 

bearbeiten: Alternativ, wenn Sie den Ausdruck werden bewertet (dh Leiten in über expr zu nennen) nicht haben wollen, und Wenn Sie sicher sind, dass es immer das letzte Argument sein wird, könnten Sie so etwas tun.

let <- function(...) { 
    args <- as.list(sys.call())[-1] 
    n <- length(args) 
    eval(args[[n]], args[-n]) 
} 

let(a = 2, b = 3, a + b) 
# [1] 5 
+0

Dank. Es sieht so aus, als müsste 'expr' als benanntes Argument übergeben werden, ansonsten wird es von' ... 'übernommen, oder? –

+0

@Ernest: ja. Alle Argumente nach '...' müssen benannt werden. –

+0

@Ernest - Sehen Sie sich die zweite Version von 'let()' an, die ich gerade hinzugefügt habe. Ich denke, es könnte die Frage beantworten, die Ihrem Kommentar zugrunde liegt ... –

1
let <- function(a,b, expr=a+b){return(expr)} 
let(2,3) 
# [1] 5 
+0

Danke, aber das scheint nur mit dem Standardausdruck zu funktionieren - 'let (a = 2, b = 3, expr = a-b)' gibt einen Fehler. –