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"))