tag img imagen etiqueta atributos r eval r-faq

imagen - tag img html atributos



Evaluar expresión dada como una cadena (5)

Alternativamente, puede usar evals de mi paquete pander para capturar la salida y todas las advertencias, errores y otros mensajes junto con los resultados en bruto:

> pander::evals("5+5") [[1]] $src [1] "5 + 5" $result [1] 10 $output [1] "[1] 10" $type [1] "numeric" $msg $msg$messages NULL $msg$warnings NULL $msg$errors NULL $stdout NULL attr(,"class") [1] "evals"

Tengo curiosidad por saber si R puede usar su función eval() para realizar cálculos proporcionados, por ejemplo, por una cadena.

Este es un caso común:

eval("5+5")

Sin embargo, en lugar de 10 obtengo:

[1] "5+5"

¿Alguna solución?


Hoy en día también puede usar la función lazyeval paquete lazyeval .

> lazyeval::lazy_eval("5+5") [1] 10


La función eval() evalúa una expresión, pero "5+5" es una cadena, no una expresión. Use parse() con text=<string> para cambiar la cadena en una expresión:

> eval(parse(text="5+5")) [1] 10 > class("5+5") [1] "character" > class(parse(text="5+5")) [1] "expression"

Llamar a eval() invoca muchos comportamientos, algunos no son inmediatamente obvios:

> class(eval(parse(text="5+5"))) [1] "numeric" > class(eval(parse(text="gray"))) [1] "function" > class(eval(parse(text="blue"))) Error in eval(expr, envir, enclos) : object ''blue'' not found

Véase también tryCatch .


Lo siento, pero no entiendo por qué demasiadas personas piensan que una cadena era algo que se podía evaluar. Debes cambiar tu mentalidad, de verdad. Olvide todas las conexiones entre cadenas en un lado y expresiones, llamadas, evaluación en el otro lado.

La (posiblemente) única conexión es a través de parse(text = ....) y todos los buenos programadores de R deben saber que esto rara vez es un medio seguro o eficaz para construir expresiones (o llamadas). Más bien, aprenda más sobre substitute() , quote() y, posiblemente, el poder de usar do.call(substitute, ......) .

fortunes::fortune("answer is parse") # If the answer is parse() you should usually rethink the question. # -- Thomas Lumley # R-help (February 2005)

Dic.2017: Ok, aquí hay un ejemplo (en los comentarios, no hay un formato agradable):

q5 <- quote(5+5) str(q5) # language 5 + 5 e5 <- expression(5+5) str(e5) # expression(5 + 5)

y si tiene más experiencia, aprenderá que q5 es una "call" mientras que e5 es una "expression" , e incluso que e5[[1]] es idéntico a q5 :

identical(q5, e5[[1]]) # [1] TRUE


Puede usar la función parse() para convertir los caracteres en una expresión. Debe especificar que la entrada es texto, porque el análisis espera un archivo de forma predeterminada:

eval(parse(text="5+5"))