development

문자열로 주어진 표현식 평가

big-blog 2020. 4. 1. 08:03
반응형

문자열로 주어진 표현식 평가


R이 eval()함수를 사용하여 문자열과 같은 계산을 수행 할 수 있는지 궁금 합니다.

이것은 일반적인 경우입니다.

eval("5+5")

그러나 10 대신에 나는 얻는다 :

[1] "5+5"

어떤 해결책?


eval()함수는 표현식을 평가하지만 표현식 "5+5"이 아닌 문자열입니다. 사용 parse()text=<string>표현에 문자열을 변경 :

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

전화 eval()는 많은 행동을 불러 일으키며, 일부는 즉시 명백하지 않습니다.

> 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

tryCatch 도 참조하십시오 .


parse()함수를 사용하여 문자를 표현식으로 변환 할 수 있습니다 . 구문 분석은 기본적으로 파일을 예상하므로 입력이 텍스트임을 지정해야합니다.

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

죄송하지만 너무 많은 사람들이 왜 문자열이 평가할 수 있다고 생각하는지 이해하지 못합니다. 정말로 사고 방식을 바꿔야합니다. 한쪽의 문자열과 다른 쪽의 표현식, 호출, 평가 사이의 모든 연결을 잊어 버리십시오.

(아마도) 유일한 연결은 가능 parse(text = ....)하며 모든 훌륭한 R 프로그래머는 이것이 표현식 (또는 호출)을 구성하는 효율적이거나 안전한 수단이 아니라는 것을 알아야합니다. 오히려 더에 대해 알아 substitute(), quote()그리고 아마도 사용의 힘을 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)

2017 년 12 월 : 좋아, 여기 예제가 있습니다 (댓글에는 멋진 형식이 없습니다).

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

e5 <- expression(5+5)
str(e5)
# expression(5 + 5)

당신이 더 많이 배울 경험을 얻을 경우 그 q5A는 "call"반면 e5입니다 "expression"심지어와 e5[[1]]동일합니다 q5:

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

또는 evalspander패키지에서 결과 및 모든 경고, 오류 및 기타 메시지와 원시 결과를 캡처 할 수 있습니다 .

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

요즘에는 패키지 lazy_eval에서 기능을 사용할 수도 있습니다 lazyeval.

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

마찬가지로 rlang:

eval(parse_expr("5+5"))

참고 URL : https://stackoverflow.com/questions/1743698/evaluate-expression-given-as-a-string

반응형