문제
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 = ....)
그리고 모든 좋은 프로그래머는 이것이 표현 (또는 전화)을 구성하는 효율적이거나 안전한 수단이라는 것을 알아야합니다. 오히려 더 자세히 알아보십시오 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"))