R: c++/c#/sigma 등과 동등한 +=(+) 및 ++(+)?
R은 다음과 같은 개념을 가지고 있습니까?+=
(+동등) 또는++
(플러스) c++/c#/clip이 하는 것처럼?
@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
'prosource' 카테고리의 다른 글
PL-SQL의 contains()는 어떻게 작동합니까? (0) | 2023.07.07 |
---|---|
한 컬렉션에서 다른 컬렉션으로 mongo 복사(같은 DB에 있음 (0) | 2023.07.07 |
파이어베이스 실시간 데이터베이스에서 삭제하는 방법은 무엇입니까? (0) | 2023.07.07 |
T-SQL: 15분 간격으로 반올림 (0) | 2023.07.07 |
아나콘다는 파이썬과 어떤 관계입니까? (0) | 2023.07.07 |