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)
당신이 더 많이 배울 경험을 얻을 경우 그 q5
A는 "call"
반면 e5
입니다 "expression"
심지어와 e5[[1]]
동일합니다 q5
:
identical(q5, e5[[1]])
# [1] TRUE
답변
또는 evals
내 pander
패키지에서 결과 및 모든 경고, 오류 및 기타 메시지와 원시 결과를 캡처 할 수 있습니다 .
> 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"))