Odpowiedzi:
Nie, nie, zobacz: Definicja języka R: operatory
Podążając za @ GregaKešpret, możesz utworzyć operator wrostek:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
x = %+=% y/2
zwraca x = (x + y)/2
. Dodanie nawiasów, czyli x = %+=% (y/2)
rozwiązanie problemu.
R nie ma pojęcia increment operator
(jak na przykład ++ w C). Jednak nie jest to trudne do wykonania samodzielnie, na przykład:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
W takim razie zadzwonisz
x <- 10
inc(x)
Jednak wprowadza narzut wywołania funkcji, więc jest wolniejszy niż x <- x + 1
sam wpisywanie . Jeśli się nie mylę, increment operator
został wprowadzony, aby ułatwić pracę kompilatorowi, ponieważ może on bezpośrednio konwertować kod na instrukcje języka maszynowego.
INC
Instrukcja została wprowadzona w procesorach głównie do implementacji liczników (por. Podręcznik programisty Intel). Zaktualizuję odpowiedź.
R nie ma tych operacji, ponieważ (większość) obiektów w R jest niezmienna. One się nie zmieniają. Zwykle, gdy wygląda na to, że modyfikujesz obiekt, w rzeczywistości modyfikujesz kopię.
Wydaliśmy pakiet, operatorzy, aby pomóc w tego rodzaju sprawach. Możesz przeczytać więcej na ten temat tutaj: 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
Możemy zastąpić +
. Jeśli +
używane jest jednoargumentowe, a jego argument sam w sobie jest jednoargumentowym +
wywołaniem, zwiększ odpowiednią zmienną w środowisku wywołującym.
`+` <- 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
inne operacje nie zmieniają się:
x + 2
# [1] 13
x ++ 2
# [1] 13
+x
# [1] 11
x
# [1] 11
Nie rób tego jednak, bo wszystko spowolni. Lub zrób to w innym środowisku i upewnij się, że nie masz dużych pętli w tych instrukcjach.
Możesz też po prostu to zrobić:
`++` <- function(x) eval.parent(substitute(x <-x +1))
a <- 1
`++`(a)
a
# [1] 2
Jest inny sposób na zrobienie tego, który uważam za bardzo łatwy i może nie być pomocny
Używam <<-
w tej sytuacji Operatorzy <<-
przypisują wartość do środowiska nadrzędnego
inc <- function(x)
{
x <<- x + 1
}
i możesz to nazwać jak
x <- 0
inc(x)
x += 1
lubx++
-x = x + 1
działa.