Operator in R
R은 다양한 연산자(Operator)를 가지고 있다.
사칙연산 시 사용되는 -
, +
, *
,
/
뿐만 아니라
==
, !=
, <=
, >=
와 같은 비교연산자,
=
, <-
, ?
, :
등과
같은 것도 모두 연산자에 포함된다.
더 이야기하면 %blahblah%
꼴로 생긴 사용자가 따로 정의할 수
있는 연산자도 얼마든지 만들 수 있다.
이렇게 많은 연산자가 코드 한 줄에 다양하게 사용된다면 고려해야할 것이
연산자의 실행 우선순위가 있겠다.
?Syntax
를 R콘솔에 작성하여 실행하면 기본연산자들의
목록이 수행절차에 대한 우선순위별로 정리된
문서가 뜬다.
예를 들어 곱셈 *
과 덧셈 +
이 같이 있는 식의
경우, 곱셈을 먼저 계산하고 그 다음 덧셈을 계산해야 할 것이다.
이 경우 덧셈과 곱셈 중 우선순위는 곱셈이 더 높은 것이다.
이처럼 R의 다양한 연산자들이 조합될 때 계산의 순서를 결정짓는 우선순위를
알고싶다면 ?Syntax
로 열리는 도움말을 참고한다.
아래의 그림이 도움말을 연 경우인데 맨 위의 연산자가 가장 높은 순으로
계산수행이 시작된다.
Question
연산자에 대한 자주 나오는 질문들이 있는데 대표적으로 몇 개만 나열해
보았다.
연산자의 우선순위에 대해 정확히 알게 된다면 해결되는 문제들이다.
<-
와 =
의
차이가 무엇인가요??
<-
와 =
는 오른쪽에 반환되는 값을 왼쪽에
할당하는 할당연산자1로 의미는 똑같다.
하지만 한가지 차이가 =
보다는 <-
이 더
우선적으로 실행된다는 차이가 존재할 뿐이다.
예를 들어 B
객체에 25 라는 값을 입력하고 A
에
B
를 입력하는 코드를 다음과 같이 작성하였다고 가정할 때 굳이
<-
, =
두개의 할당연산자를 혼용해
보았다.
<- B = 25 A
그런데 위의 코드가 정상적으로 동작할까?
그렇지 않다.
왜냐하면 =
보다 <-
가 먼저 수행이 될
텐데 B
객체에는 세상에 존재하지 않는 친구이다.
따라서 A
에 할당시켜야 하는 값을 R은 알지 못하여 에러가
난다.
## Error in A <- B = 25 : object 'A' not found
B 가 25라는 값으로 먼저 할당되기 위하여 아래와 같은 방법들을 이용하게 될 것이다.
- 한 줄짜리 코드를 단락을 나누어 수행순서 강제 변경
<- 25
B <- B A
- 괄호를 이용하여 수행순서 강제 변경
<- (B = 25) A
- 정말로 연산자의 우선순위를 고려한 코딩
= B <- 25 A
- 할당연산자를 통일시킴
= B = 25
A <- B <- 25 A
음의정수값 연산이 생각대로 안되요
-10^2
## [1] -100
-10 의 제곱은 100이지만,
위의 코드가 100이 반환되기를 기대한 순간 ?Syntax
를 다시
참고할 시간인 것이다.
나는 항상 100이 되길 기대하기 때문에 빈번히 연산자 우선순위를 다시
기억하기 위해 ?Syntax
도움말을 열어본다..
-
보다^
이 먼저 수행되는 문제를 괄호를 통해 해결
-10)^2 (
## [1] 100
- -10 의 값을 사전에 객체로 할당하고, 그 객체에 제곱을 취함
<- -10
C ^2 C
## [1] 100
seq(2, 20, by=2)
를 :
연산자를 통하여 더 간단한 코드로 만들고 싶습니다
seq(2, 20, by=2)
의 결과를 잘 살펴보면
seq(2, 20, by = 2)
## [1] 2 4 6 8 10 12 14 16 18 20
1:10
의 모든 결과값에
1:10
## [1] 1 2 3 4 5 6 7 8 9 10
2를 곱한 것과 같다.
1:10)*2 (
## [1] 2 4 6 8 10 12 14 16 18 20
그런데 (1:10)*2
의 코드가 사실 가장 간단히 구현된 코드가
아니었다.
연산자 우선순위를 잘 알지 못한다면 습관적으로 1:10
이 먼저
수행되어야 한다는 생각에 괄호를 본능적으로 둘러싸게 될 텐데,
그렇지 않더라도 :
연산자는 *
보다 우위에
있으므로 1:10
을 먼저 계산 이후에 곱 연산 *
을
수행한다.
따라서 괄호를 생략하고 아래와 같이 코드를 작성해도 된다.
1:10*2
## [1] 2 4 6 8 10 12 14 16 18 20
이밖에도 연산자 우선순위에 대한 추가 예제는 ?Syntax
의
예제코드에 훌륭한 것이 많다.
## Logical AND ("&&") has higher precedence than OR ("||"):
TRUE || TRUE && FALSE # is the same as
TRUE || (TRUE && FALSE) # and different from
TRUE || TRUE) && FALSE
(
## Special operators have higher precedence than "!" (logical NOT).
## You can use this for %in% :
! 1:10 %in% c(2, 3, 5, 7) # same as !(1:10 %in% c(2, 3, 5, 7))
## but we strongly advise to use the "!( ... )" form in this case!
## '=' has lower precedence than '<-' ... so you should not mix them
## (and '<-' is considered better style anyway):
## Consequently, this gives a ("non-catchable") error
<- y = 5 #-> Error in (x <- y) = 5 : .... x
사실 할당연산자 중
->
도 존재한다 방향이 반대이니 이 연산자를 기준으로 왼쪽편에 있는 코드의 반환값을 오른쪽으로 할당한다.<<-
와 같은 할당연산자도 있는데 어떤상황이든 전역환경(global environment)으로 지정하여 할당하는 특수한 할당연산자이다↩︎