R : + = (플러스 같음) 및 ++ (플러스 플러스)는 c ++ / c # / java 등에서 동등합니까?


답변:



64

@ GregaKešpret에 따라 infix 연산자를 만들 수 있습니다.

`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x

6
(+1)이지만 경고 단어입니다. 입력하면를 x = %+=% y/2반환합니다 x = (x + y)/2. 괄호를 추가 x = %+=% (y/2)하면 문제가 해결됩니다.
knrumsey

@knrumsey 왜 그렇습니까? 나눗셈이 우선 순위가 높은 연산자라고 생각했을 것입니다.
David Kelley

@DavidKelley 확실하지 않습니다. 나는 당신과 함께 있습니다. 한 번 프로젝트 에서이 문제에 부딪 쳤고 문제를 찾는 데 1 시간이 걸렸습니다.
knrumsey

추가하지 않고 함수를 실행하고 있음을 기억하십시오. 함수는 우선 순위가 가장 높으므로 괄호없이 y를 함수 입력으로 구문 분석하고 다음 단계는 체인 아래로 나눕니다. 괄호는 (y / 2) 연산을 체인 상단으로 올립니다.
Justin

33

R에는 increment operator(예를 들어 C의 ++와 같은) 개념이 없습니다 . 그러나 다음과 같이 직접 구현하는 것은 어렵지 않습니다.

inc <- function(x)
{
 eval.parent(substitute(x <- x + 1))
}

이 경우에는

x <- 10
inc(x)

그러나 함수 호출 오버 헤드가 발생하므로 직접 입력하는 것 보다 느립니다x <- x + 1 . 내가 실수하지 않으면 increment operator컴파일러 작업을 쉽게하기 위해 코드가 해당 기계 언어 명령어로 직접 변환 될 수 있기 때문에 소개되었습니다.


3
이 함수는 값을 반환 한 다음 후행 증분 ++처럼 증분 할 수 없습니다. + = 또는 사전 증가 ++와 더 비슷합니다.
Megatron

잘못된! 컴파일러 작업을보다 쉽게하기 위해 증분이 도입되지 않았습니다. INC명령은 주로 카운터 구현을 위해 프로세서 에 도입 되었습니다 (참조 : 인텔 소프트웨어 개발자 매뉴얼). 답변을 업데이트하겠습니다.
banan3'14

19

R의 (대부분) 객체는 변경할 수 없으므로 R에는 이러한 연산이 없습니다. 그들은 변하지 않습니다. 일반적으로 객체를 수정하는 것처럼 보일 때 실제로 사본을 수정하는 것입니다.


18
불변성은 객체에 대한 훌륭한 / 바람직하지 않은 속성이지만 (읽기 : 버그가 적음) 불변성은 + = 질문과 관련이 있다고 생각하지 않습니다. 다른 언어에서는 + =를 불변 유형 (예 : .net의 문자열)에 적용 할 수 있습니다. 작업은 단순히 새로운 객체를 생성하고 주어진 변수를 그 새로운 객체에 할당합니다. 불변성이 유지되고 변수가 업데이트됩니다.
SFun28

4
좋은 지적. 그러나 불변성은 분명히 이런 종류의 작업을 덜 자연스럽게 만듭니다.
hadley

15

10 씩 증가 및 감소

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10

7
이 기능 Hmisc은 버전 4.1.0 부터 제거 된 것으로 보입니다 .
llasram

@llasram 그 표기법을보고, 나는 누구를 비난 할 수 없습니다.
BER들


3

재정의 할 수 있습니다 +. 단항 +을 사용하고 인수 자체가 단항 +호출 인 경우 호출 환경에서 관련 변수를 증가시킵니다.

`+` <- function(e1,e2){
    # if unary `+`, keep original behavior
    if(missing(e2)) {
      s_e1 <- substitute(e1)
      # if e1 (the argument of unary +) is itself an unary `+` operation
      if(length(s_e1) == 2 && 
         identical(s_e1[[1]], quote(`+`)) && 
         length(s_e1[[2]]) == 1){
        # increment value in parent environment
        eval.parent(substitute(e1 <- e1 + 1,list(e1 = s_e1[[2]])))
      # else unary `+` should just return it's input
      } else e1
    # if binary `+`, keep original behavior
    } else .Primitive("+")(e1,e2)
}

x <- 10
++x
x
# [1] 11

다른 작업은 변경되지 않습니다.

x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11

모든 것을 느리게 할 수는 있지만 그렇게하지 마십시오. 또는 다른 환경에서 수행하고이 지침에 큰 고리가 없는지 확인하십시오.

당신은 또한 이것을 할 수 있습니다 :

`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2

-1

이 작업을 수행하는 또 다른 방법이 있습니다. 매우 쉽게 찾을 수 있습니다. 어쩌면 도움이되지 않을 수도 있습니다.

<<-이러한 상황에 사용 합니다. 운영자 <<-가 상위 환경에 값을 할당합니다

inc <- function(x)
{
   x <<- x + 1
}

그리고 당신은 그것을처럼 호출 할 수 있습니다

x <- 0
inc(x)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.