Есть ли у R понятие +=
(плюс равно) или ++
(плюс плюс), как С++/С#/others?
R: + = (плюс равно) и ++ (плюс плюс) эквивалент от С++/С#/java и т.д.?
Ответ 1
Нет, это не так: R Определение языка: Операторы
Ответ 2
Следуя @GregaKešpret, вы можете сделать оператор инфикса:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
Ответ 3
R не имеет понятия increment operator
(как, например, ++ в C). Однако, нетрудно реализовать их самостоятельно, например:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
В этом случае вы бы назвали
x <- 10
inc(x)
Однако он вводит служебные данные функции, поэтому медленнее, чем вводить x <- x + 1
самостоятельно. Если я не ошибаюсь, был введен increment operator
, чтобы облегчить работу с компилятором, поскольку он может напрямую преобразовать код в эти инструкции машинного языка.
Ответ 4
R не имеет этих операций, потому что (большинство) объектов в R неизменяемы. Они не меняются. Обычно, когда похоже, что вы изменяете объект, вы фактически изменяете копию.
Ответ 5
Увеличение и уменьшение на 10.
require(Hmisc)
inc(x) <- 10
dec(x) <- 10
Ответ 6
Мы выпустили пакет, 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
Ответ 7
Мы можем переопределить +
. Если используется унарный +
, а его аргумент сам является унарным вызовом +
, то увеличьте значение соответствующей переменной в вызывающей среде.
'+' <- 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 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
Ответ 8
Есть еще один способ сделать это, который я нахожу очень простым, может быть, вам не поможет
Я использую <<-
для этих ситуаций
Операторы <<-
присваивают значение родительской среде
inc <- function(x)
{
x <<- x + 1
}
и вы можете назвать это как
x <- 0
inc(x)