R:+=(加等于)和++(加加)等价于C++/C#/Java等。

与C++/C#/Others一样,R是否具有+=(加等于)或++(加加)的概念?

176631 次浏览

递增和递减10。

require(Hmisc)
inc(x) <- 10


dec(x) <- 10

不,它不会,请参阅:R语言定义:运算符

R没有increment operator的概念(例如C中的++)。不过,自己实现一个并不难,例如:

inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}

那样的话你会打电话的。

x <- 10
inc(x)

但是,它引入了函数调用开销,因此它慢一点,而不是自己输入x <- x + 1。如果我没弄错的话,__引入ABC__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

library(inplace)
x <- 1
x %+<-% 2

如果要在数组中使用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

因为=<-并不总是等价的,如在?`<-`中所述