2012-04-04 3 views
3

Je suis en train d'écrire une fonction let qui me permet de faire des choses comme:Comment émuler la fonction let de Lisp dans R?

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

Actuellement, je suis coincé avec

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

qui ne fonctionne pas du tout. Toute aide appréciée.

Répondre

11

est ici une façon:

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

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

Modifier: Sinon, si vous ne voulez pas avoir de nommer l'expression-être à une évaluation (par exemple le transmettre via expr), et Si vous êtes certain que ce sera toujours le dernier argument, vous pouvez faire quelque chose comme ça.

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

Merci. Il semble que 'expr' doit être passé comme un argument nommé, sinon il est capturé par' ... ', non? –

+0

@Ernest: oui. Tous les arguments après '...' doivent être nommés. –

+0

@Ernest - Jetez un oeil à la seconde version de 'let()', que je viens d'ajouter. Je pense qu'il peut répondre à la question sous-jacente à votre commentaire ... –

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

Merci, mais cela ne semble fonctionner qu'avec l'expression par défaut - 'let (a = 2, b = 3, expr = a-b)' donne une erreur. –