Відповіді:
Ні, це не так, див. 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
інструкція була введена в процесори насамперед для впровадження лічильників (див. Посібник для розробника програмного забезпечення Intel). Я оновлю відповідь.
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
Ми можемо перекрити +
. Якщо +
використовується unry і її аргумент є самим одинаковим +
викликом, то збільшуйте відповідну змінну в середовищі виклику.
`+` <- 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
Є ще один спосіб зробити це, який мені здається дуже легким, можливо, може бути відмовитись від допомоги
Я використовую <<-
для цієї ситуації Оператори <<-
присвоюють значення батьківському середовищу
inc <- function(x)
{
x <<- x + 1
}
і ти можеш назвати це так
x <- 0
inc(x)
x += 1
абоx++
-x = x + 1
працює.