답변:
아니오, 그렇지 않습니다 : R 언어 정의 : 연산자
@ GregaKešpret에 따라 infix 연산자를 만들 수 있습니다.
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
x = %+=% y/2
반환합니다 x = (x + y)/2
. 괄호를 추가 x = %+=% (y/2)
하면 문제가 해결됩니다.
R에는 increment operator
(예를 들어 C의 ++와 같은) 개념이 없습니다 . 그러나 다음과 같이 직접 구현하는 것은 어렵지 않습니다.
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
이 경우에는
x <- 10
inc(x)
그러나 함수 호출 오버 헤드가 발생하므로 직접 입력하는 것 보다 느립니다x <- x + 1
. 내가 실수하지 않으면 increment operator
컴파일러 작업을 쉽게하기 위해 코드가 해당 기계 언어 명령어로 직접 변환 될 수 있기 때문에 소개되었습니다.
INC
명령은 주로 카운터 구현을 위해 프로세서 에 도입 되었습니다 (참조 : 인텔 소프트웨어 개발자 매뉴얼). 답변을 업데이트하겠습니다.
R의 (대부분) 객체는 변경할 수 없으므로 R에는 이러한 연산이 없습니다. 그들은 변하지 않습니다. 일반적으로 객체를 수정하는 것처럼 보일 때 실제로 사본을 수정하는 것입니다.
우리는 이런 종류의 일을 돕기 위해 로프 로터 패키지를 출시했습니다. https://happylittlescripts.blogspot.com/2018/09/make-your-r-code-nicer-with-roperators.html 에서 자세한 내용을 확인할 수 있습니다.
install.packages('roperators')
require(roperators)
x <- 1:3
x %+=% 1; x
x %-=% 3; x
y <- c('a', 'b', 'c')
y %+=% 'text'; y
y %-=% 'text'; y
# etc
재정의 할 수 있습니다 +
. 단항 +
을 사용하고 인수 자체가 단항 +
호출 인 경우 호출 환경에서 관련 변수를 증가시킵니다.
`+` <- 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
x += 1
또는x++
-x = x + 1
작품.