与C++/C#/Others一样,R是否具有+=(加等于)或++(加加)的概念?
+=
++
递增和递减10。
require(Hmisc) inc(x) <- 10 dec(x) <- 10
不,它不会,请参阅:R语言定义:运算符
R没有increment operator的概念(例如C中的++)。不过,自己实现一个并不难,例如:
increment operator
inc <- function(x) { eval.parent(substitute(x <- x + 1)) }
那样的话你会打电话的。
x <- 10 inc(x)
但是,它引入了函数调用开销,因此它慢一点,而不是自己输入x <- x + 1。如果我没弄错的话,__引入ABC__1是为了使编译器的工作更容易,因为它可以直接将代码转换为那些机器语言指令。
x <- x + 1
R没有这些操作,因为R中的(大多数)对象是不可变的。它们不会改变。通常情况下,当你看起来像是在修改一个对象时,你实际上是在修改一个副本。
在@gregakešpret之后,您可以创建一个中缀操作符:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2)) x = 1 x %+=% 2 ; x
我们发布了一个名为Roperators的软件包来帮助解决这类问题。你可以在这里了解更多: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 binary `+`, keep original behavior if(!missing(e2)) return(base::`+`(e1, e2)) # if inner call isn't unary `+` called on language object, # keep original behavior inner_call <- substitute(e1) inner_call_is_plus_on_lng <- length(inner_call) == 2 && identical(inner_call[[1]], quote(`+`)) && is.language(inner_call[[2]]) if(!inner_call_is_plus_on_lng) return(base::`+`(e1)) eval.parent(substitute(X <- X + 1, list(X = inner_call[[2]]))) } x <- 10 ++x x #> [1] 11
其他操作不变:
x + 2 #> [1] 13 x ++ 2 #> [1] 13 +x #> [1] 11 x #> [1] 11
我真的不能推荐它,因为你正在搞乱那些出于某种原因而优化的原语。
我们还可以使用inplace
inplace
library(inplace) x <- 1 x %+<-% 2
如果要在数组中使用i++来增加索引,则可以尝试i <- i + 1,例如,
i++
i <- i + 1
k = 0 a = 1:4 for (i in 1:4) cat(a[k <- k + 1], " ") # 1 2 3 4
但是这里<-不能被=替换,其不更新索引,
<-
=
k = 0 a = 1:4 for (i in 1:4) cat(a[k = k + 1], " ") # 1 1 1 1
因为=和<-并不总是等价的,如在?`<-`中所述
?`<-`