Answers:
在@GregaKešpret之后,您可以创建一个中缀运算符:
`%+=%` = 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
指令是在处理器中引入的,主要用于实现计数器(请参阅《英特尔软件开发人员手册》)。我将更新答案。
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
我们可以覆盖+
。如果使用一元+
,并且其参数本身是一元+
调用,则在调用环境中增加相关变量。
`+` <- 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
工作。