De texto a función

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 sobre “De texto a función

  1. David 22 enero, 2020 19:43

    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.

Los comentarios están desabilitados.