Problema: convertir una expresión definida por un usuario (p.e., algo como "a+b"
) en una función (i.e., function(a, b) a + b
).
Solución:
gen_foo <- function(expr){ my_args <- all.vars(parse(text = expr)) expr <- paste0("function(", paste(my_args, collapse = ","), ") ", expr) eval(parse(text = expr)) }
Demostración:
multiplica <- gen_foo("a * b") multiplica(5, 31)
Un comentario de seguridad. Si el usuario final, por cualquier motivo, solo debería tener acceso a una serie de funciones (por ejemplo, en un shiny), usar eval(parse()) permite acceder hasta a comandos del sistema. Por ejemplo alguien podría hacer:
gen_foo("system('df -h')")()
Obviamente con comandos mucho más peligrosos que df.