R: + = (плюс равно) и ++ (плюс плюс) эквивалент из c ++ / c # / java и т. Д.? - PullRequest
128 голосов
/ 21 апреля 2011

Имеет ли R понятие += (плюс равно) или ++ (плюс плюс), как c ++ / c # / другие делают?

Ответы [ 7 ]

94 голосов
/ 21 апреля 2011
59 голосов
/ 18 февраля 2013

После @ GregaKešpret вы можете сделать инфиксный оператор:

`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
31 голосов
/ 21 апреля 2011

R не имеет понятия increment operator (как, например, ++ в C).Тем не менее, это не сложно реализовать самостоятельно, например:

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

В этом случае вы бы вызвали

x <- 10
inc(x)

Однако, это приводит к накладным расходам на вызов функции, поэтому это медленнее , чем печатать x <- x + 1 самостоятельно.Если я не ошибаюсь, был введен increment operator, чтобы упростить работу для компилятора, поскольку он мог напрямую преобразовывать код в эти инструкции машинного языка.

17 голосов
/ 21 апреля 2011

R не имеет этих операций, потому что (большинство) объектов в R являются неизменяемыми.Они не меняются.Обычно, когда кажется, что вы модифицируете объект, вы на самом деле модифицируете копию.

15 голосов
/ 21 апреля 2011

Увеличение и уменьшение на 10.

require(Hmisc)
inc(x) <- 10 

dec(x) <- 10
3 голосов
/ 25 января 2019

Мы можем переопределить +. Если используется унарный +, а его аргумент сам является унарным + вызовом, то увеличьте значение соответствующей переменной в вызывающей среде.

`+` <- 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
3 голосов
/ 25 сентября 2018

Мы выпустили пакет, roperators, чтобы помочь с такими вещами. Подробнее об этом вы можете прочитать здесь: 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
...