문제

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

또는 사용할 수 있습니다 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"))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top