Risposte:
No, non vedere: R Definizione del linguaggio: Operatori
Seguendo @ GregaKešpret puoi creare un operatore infix:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
x = %+=% y/2
restituisce x = (x + y)/2
. L'aggiunta di parentesi, ovvero x = %+=% (y/2)
risolve il problema.
R non ha un concetto di increment operator
(come ad esempio ++ in C). Tuttavia, non è difficile implementarlo da soli, ad esempio:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
In tal caso chiameresti
x <- 10
inc(x)
Tuttavia, introduce un overhead di chiamata di funzione, quindi è più lento della digitazione x <- x + 1
. Se non sbaglio è increment operator
stato introdotto per semplificare il lavoro per il compilatore, in quanto potrebbe convertire direttamente il codice in quelle istruzioni del linguaggio macchina.
INC
le istruzioni sono state introdotte nei processori principalmente per l'implementazione dei contatori (vedere il Manuale per gli sviluppatori del software Intel). Aggiornerò la risposta.
R non ha queste operazioni perché (la maggior parte) degli oggetti in R sono immutabili. Non cambiano. In genere, quando sembra che tu stia modificando un oggetto, stai effettivamente modificando una copia.
Abbiamo rilasciato un pacchetto, operatori, per aiutare con questo tipo di cose. Puoi leggere di più qui: 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
Possiamo scavalcare +
. Se +
viene utilizzato unario e il suo argomento è esso stesso una +
chiamata unaria , quindi incrementare la variabile rilevante nell'ambiente chiamante.
`+` <- 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
le altre operazioni non cambiano:
x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11
Non farlo, perché rallenti tutto. Oppure fallo in un altro ambiente e assicurati di non avere grandi loop su queste istruzioni.
Puoi anche solo fare questo:
`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2
C'è un altro modo di farlo, che trovo molto semplice, forse potrebbe essere di aiuto
Uso <<-
per queste situazioni Gli operatori <<-
assegnano il valore all'ambiente padre
inc <- function(x)
{
x <<- x + 1
}
e puoi chiamarlo come
x <- 0
inc(x)
x += 1
ox++
-x = x + 1
funziona.