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.

Comenta

Your email address will not be published.

Puedes usar estas etiquetas y atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.