prosource

R: c++/c#/sigma 등과 동등한 +=(+) 및 ++(+)?

probook 2023. 7. 7. 19:06
반응형

R: c++/c#/sigma 등과 동등한 +=(+) 및 ++(+)?

R은 다음과 같은 개념을 가지고 있습니까?+=(+동등) 또는++(플러스) c++/c#/clip이 하는 것처럼?

아니요, 그렇지 않습니다. R 언어 정의: 연산자

@GregaKespret 다음으로 infix 연산자를 만들 수 있습니다.

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

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

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

그런 경우에 당신은 전화를 할 것입니다.

x <- 10
inc(x)

하지만 함수 호출 오버헤드를 도입하여 타이핑보다 느립니다.x <- x + 1네 자신.내가 틀리지 않았다면요increment operator컴파일러가 코드를 기계어 명령어로 직접 변환할 수 있기 때문에 더 쉽게 작업할 수 있도록 하기 위해 도입되었습니다.

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

10씩 증가 및 감소합니다.

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10

우리는 이런 종류의 일을 돕기 위해 운영자들을 위한 패키지를 출시했습니다.자세한 내용은 여기에서 확인할 수 있습니다. 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 binary `+`, keep original behavior
  if(!missing(e2)) return(base::`+`(e1, e2))
  
  # if inner call isn't unary `+` called on language object,
  # keep original behavior
  inner_call <- substitute(e1)
  inner_call_is_plus_on_lng <-
    length(inner_call) == 2 &&
    identical(inner_call[[1]], quote(`+`)) &&
    is.language(inner_call[[2]])
  if(!inner_call_is_plus_on_lng) return(base::`+`(e1))
  
  eval.parent(substitute(X <- X + 1, list(X = inner_call[[2]])))
}

x <- 10

++x
x
#> [1] 11

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

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

저는 당신이 어떤 이유로 최적화된 원시적인 것들을 엉망으로 만들고 있기 때문에 그것을 정말 추천할 수 없습니다.

우리는 또한 사용할 수 있습니다.inplace

library(inplace)
x <- 1
x %+<-% 2

사용할 경우i++인덱스를 증가시키는 배열에서 시도할 수 있습니다.i <- i + 1,예를들면,

k = 0
a = 1:4
for (i in 1:4) 
    cat(a[k <- k + 1], " ")
# 1 2 3 4

그런데 여기서<-대체할 수 없음=색인을 업데이트하지 않습니다.

k = 0
a = 1:4
for (i in 1:4) 
    cat(a[k = k + 1], " ")
# 1 1 1 1

부터=그리고.<-에서 언급한 바와 같이 항상 동등한 것은 아닙니다.?`<-`

다음은 변수를 증가시키는 더 간단한 방법입니다.

inc = 1

for(i in 1:10){
    print(paste("Value of inc: ", inc))
    inc = sum(c(inc, 1))
}

다음과 같은 결과를 얻을 수 있습니다.

[1] "Value of inc:  1"
[1] "Value of inc:  2"
[1] "Value of inc:  3"
[1] "Value of inc:  4"
[1] "Value of inc:  5"
[1] "Value of inc:  6"
[1] "Value of inc:  7"
[1] "Value of inc:  8"
[1] "Value of inc:  9"
[1] "Value of inc:  10"

언급URL : https://stackoverflow.com/questions/5738831/r-plus-equals-and-plus-plus-equivalent-from-c-c-java-etc

반응형