2014-12-08 5 views
4

산술 연산자 (역 따옴표)가 마치 산술 함수처럼 작동하는 경우가 있습니다.산술 연산자가 산술 함수보다 선호 되는가?

연산기 :

> `+`(4, 5) 
[1] 9 

연산 함수 :

> sum(4, 5) 
[1] 9 

그러나 연산기 일반적인 산술 함수 같은 벡터를 통해이를 않는다 :

> `+`(1:5) 
[1] 1 2 3 4 5 

적이 있는가 산술 연산자가 산술 기능보다 더 좋은 모든 인스턴스 엔?

+2

이 질문을 이해할 수 없습니다. 단항'+'연산자 (이항 연산자와 같지 않음)는 문서화 된대로 동작합니다. 왜 그것이'sum'처럼 행동 할 것이라고 기대합니까? – Roland

+0

@Roland,'+ '가이 경우 단항 연산자 인 경우 하나의 피연산자만을 취하며 합계보다 작습니다. –

답변

11

제목의 질문에, 나는 일반적으로 또는 일반적으로 말할 것입니다. R에서 우리는 대개 동일한 경우 또는 주제의 일부라는 의미에서 벡터의 값의 순서를 병렬로 열 또는 벡터로 작업합니다. 당신의 예에서 당신은 실제로 행동 세 가지 다른 기능을보고있다 :

첫째 :

> `+`(-3:3) 
[1] -3 -2 -1 0 1 2 3 
> `+`(c(TRUE,FALSE)) 
[1] 1 0 
: 숫자 벡터를 제공하지만, 논리적 벡터를 제공 할 때 숫자에 강제 할 것입니다 때 기본적으로 아무것도하지 않는 단항 '+'연산자

이 아니며이 반환 값의 모든 값을 주석 중 하나에 명시된 것처럼 양수로 만듭니다.

다음 : 이진 '+'연산자

> `+`(-3:3, 0:6) 
[1] -3 -1 1 3 5 7 9 

마지막 :

> sum(-3:3, 0:6, c(TRUE,FALSE)) 
[1] 22 

: _not_vectorized_이다 그들의 조합의 합계 값을 모두 축소 할 sum 함수 이진 +은 (경고와 함께) 인수를 재활용합니다.

> `+`(-3:3, c(TRUE,FALSE)) 
[1] -2 -2 0 0 2 2 4 
Warning message: 
In -3:3 + c(TRUE, FALSE) : 
    longer object length is not a multiple of shorter object length 

"병렬로"벡터에서 작업 할 때 종종 벡터화 된 연산자를 사용하고 길이 1의 값만 반환 할 수있는 sum 결과에 매우 실망합니다. 함수 인수에 의존하는 outer과 같은 일부 함수는 다음을 필요로합니다. 함수가 벡터화되어야합니다.

> outer(1:4, 5:8, sum) 
Error in outer(1:4, 5:8, sum) : 
    dims [product 16] do not match the length of object [1] 
> outer(1:4, 5:8, "+") 
    [,1] [,2] [,3] [,4] 
[1,] 6 7 8 9 
[2,] 7 8 9 10 
[3,] 8 9 10 11 
[4,] 9 10 11 12 

다른 경우에는 단일 값이 반환되어야합니다. 그리고 'mapply'와 같은 몇몇 사람들은 그 주제에 대해 불가지론 자입니다.

> mapply(sum, 1:4, 5:8) 
[1] 6 8 10 12 
> mapply("+", 1:4, 5:8) 
[1] 6 8 10 12 

Vectorize

는 비 벡터화 기능의 버전을 만드는 데 사용할 수 있습니다 내부적으로는 다른 기능을 반환 mapply을 사용하고 있지만,이 인수 이름을 사용하지 않기 때문에 그것은 비 기본 기능으로 제한됩니다 (따라서 sum을 벡터화 할 수 없습니다.)

?Syntax을 참조하여 R 우선 순위 규칙을 얻을 수있는 우선 순위가 다를 수 있습니다. (단항 연산자는 이진 연산자보다 우선 순위가 높습니다.함수와 괄호가 암시 적으로 우선 순위가 가장 높습니다. 나는 사용자 정의 함수의 더 높은 우선 순위 때문에 놀라움이 있었던 상황을 보았습니다.)