Respuestas:
No, no lo hace, ver: R Definición del lenguaje: Operadores
Siguiendo @ GregaKešpret puedes hacer un operador infijo:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
x = %+=% y/2
vuelve x = (x + y)/2
. Agregar paréntesis, es decir, x = %+=% (y/2)
resuelve el problema.
R no tiene un concepto de increment operator
(como por ejemplo ++ en C). Sin embargo, no es difícil implementar uno usted mismo, por ejemplo:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
En ese caso llamarías
x <- 10
inc(x)
Sin embargo, presenta una sobrecarga de llamadas de función, por lo que es más lento que escribir x <- x + 1
usted mismo. Si no me equivoco, increment operator
se introdujo para facilitar el trabajo del compilador, ya que podría convertir el código a esas instrucciones de lenguaje de máquina directamente.
INC
la instrucción se introdujo en procesadores principalmente para implementar contadores (véase el Manual del desarrollador de software de Intel). Actualizaré la respuesta.
R no tiene estas operaciones porque (la mayoría) de los objetos en R son inmutables. No cambian Por lo general, cuando parece que está modificando un objeto, en realidad está modificando una copia.
Lanzamos un paquete, roperators, para ayudar con este tipo de cosas. Puede leer más sobre esto aquí: 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
Podemos anular +
. Si +
se usa unario y su argumento es en sí mismo una +
llamada unaria , entonces incremente la variable relevante en el entorno de llamada.
`+` <- 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
otras operaciones no cambian:
x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11
Sin embargo, no lo hagas, ya que ralentizarás todo. O hágalo en otro entorno y asegúrese de no tener grandes bucles en estas instrucciones.
También puedes hacer esto:
`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2
Hay otra forma de hacer esto, que me parece muy fácil, tal vez podría ser de alguna ayuda
Utilizo <<-
para esta situación Los operadores <<-
asignan el valor al entorno principal
inc <- function(x)
{
x <<- x + 1
}
y puedes llamarlo así
x <- 0
inc(x)
x += 1
ox++
...x = x + 1
funciona.