2012-06-08 3 views
6

The manual 상태 :"="R 연산자를 함수에서 사용하지 않아야하는 이유는 무엇입니까?

운영자 '<가 -'어디서나 사용할 수 있으며, 운영자 반면 가 '='에만 최상위 수준에 허용된다 (예를 들어, 명령 프롬프트에서 입력 한 완전한 표현 ) 또는 하나의 부분 식 중괄호로 묶은 식 목록에.

The question here은 함수 호출에서 사용될 때 차이점을 언급합니다. 그러나 함수 정의에서 정상적으로 작동하는 것 같다 :

a = function() 
{ 
    b = 2 
    x <- 3 
    y <<- 4 
} 

a() 
# (b and x are undefined here) 

을 수동이 the operator ‘=’ is only allowed at the top level 것을 언급 왜?

language definition에서 그것에 대해 아무것도 없다 (나열된 = 운영자, 어떤 수치도 없다!)

+0

R-lang의 [10.4.2 중위 및 접두사 연산자] (http://cran.r-project.org/doc/manuals/R-lang.html#Infix-and-prefix-operators)에 언급되어 있습니다.),하지만 당신이 언급 한 도움말 항목에있는 것보다 훨씬 더 많이 말하지는 않습니다. –

+5

당신이 인용 한 텍스트는 "최상위 수준 ** OR ** ** 하위 표현식의 중괄호 목록"이라고 말합니다. 하위 표현식의 중괄호 목록에서이를 사용하고 있습니다. 허용되는 것. – Andrie

+5

최상위도 아니고 중괄호도 아닌 표현식을 찾으려면 큰 길을 가야합니다. 여기 하나 있습니다. 'try (x <- f())'는 괜찮지 만'try (x = f (x))'는 그렇지 않다. 대입 연산자를 사용하거나 중괄호를 추가하십시오. –

답변

12

당신이 인용 텍스트는 at the top level OR in a braced list of subexpressions을 말한다. 하위 표현식의 중괄호 목록에서이를 사용하고 있습니다. 허용되는 것.

최상위도 아니고 중괄호도 아닌 표현식을 찾으려면 큰 길을 가야합니다. 여기 하나 있습니다. 종종 try 블록 내에 과제를 래핑하고 싶습니다. try(x <- f())은 괜찮지 만 try(x = f(x))은 아닙니다. 할당 연산자를 변경하거나 중괄호를 추가해야합니다.

+0

Vincent, 감사합니다.하지만 어떻게 대답합니까? 내 예제에서'b = 2'에 대한 제 질문이 잘못 되었습니까? 어쩌면 내가 뭔가를 놓친다 그래서 더 명백한 방법으로 설명 해주십시오 :) – TMS

+0

@ 토마스 당신이 도움이되는 것으로 제 의견을 추가했습니다.나는 이것이 질문에 대답한다고 생각한다. – Andrie

+0

감사합니다 Andrie, 멋지다! – TMS

7

표현하지 최상위 수준이 if 같은 제어 구조의 사용을 포함한다. 예를 들어, 다음 프로그래밍 오류는 잘못되었습니다. 여기에 언급 한 바와 같이

> if(x = 0) 1 else x 
Error: syntax error 

:

https://stackoverflow.com/a/4831793/210673이 항목은 http://developer.r-project.org/equalAssign.html

+0

[두 번째 링크] (http://developer.r-project.org/equalAssign.html)에 감사드립니다! 가장 중요한 정보는 다음과 같습니다. * "허용되는 경우,'= '연산자는 모든 이전 과제 (즉, <및 기타)와 의미 상 동일합니다. * – TMS

3

다른 예로는 system.time과 같은 몇 가지 예 이외에 <-=은 다른 결과를 나타냅니다. 주된 차이점은 더 철학적입니다. Perl의 창안자 인 래리 월 (Larry Wall)은 "비슷한 것들이 유사하게 보일 것이고, 다른 것들이 다르게 보일 것"이라고 말하면서, 다른 언어로 "유사한"것으로 여겨지는 것과 " 다른". 이제 R 할당에 대한의 2 개 명령을 비교하자 일부는 우리가 우리가 무엇을하고 있는지 유사하다 1:10a에 할당되는 두 경우 모두 그 주장

myfun(a <- 1:10) 

myfun(a = 1:10) 

.

다른 인자가 첫 번째 통화로 우리 myfun가 호출되고 상기 제 호에서 우리가 작성한 환경에 가변 a에 할당되는 것과 동일한 환경에 가변 a에 할당된다는 것이다 함수가 호출되어 함수에 대해 로컬 일 때 두 개의 변수가 서로 다릅니다.

따라서 사용법은 "유사"또는 "다른"할당 여부에 따라 다릅니다.

개인적으로 나는 <-을 선호하지만, 나는 그것이 거룩한 전쟁과 싸울 가치가 있다고 생각하지 않습니다.

관련 문제