R:+;=(加等于)和++;c+的(加上)等价物+/c#/java等。?
R是否像c++/c#/其他人一样有R:+;=(加等于)和++;c+的(加上)等价物+/c#/java等。?,r,operators,variable-assignment,increment,R,Operators,Variable Assignment,Increment,R是否像c++/c#/其他人一样有+=(加号等于)或++(加号)的概念?递增和递减10 require(Hmisc) inc(x) <- 10 dec(x) <- 10 require(Hmisc) inc(x)不,它没有,请参见:R没有增量运算符的概念(例如C中的++)。但是,自己实施一个并不困难,例如: inc <- function(x) { eval.parent(substitute(x <- x + 1)) } incR没有这些操作,因为R中的(大多
+=
(加号等于)或++
(加号)的概念?递增和递减10
require(Hmisc)
inc(x) <- 10
dec(x) <- 10
require(Hmisc)
inc(x)不,它没有,请参见:R没有增量运算符的概念(例如C中的++)。但是,自己实施一个并不困难,例如:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
incR没有这些操作,因为R中的(大多数)对象是不可变的。它们不会改变。通常,当看起来你在修改一个对象时,实际上你在修改一个副本。遵循@GregaKešpret,你可以创建一个中缀操作符:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
`%+=%`=function(e1,e2)eval.parent(replacement)(e1我们发布了一个名为roperators的软件包来帮助解决这类问题。您可以在这里阅读更多信息:
install.packages('roperators'))
要求(索具)
x我们可以重写+
。如果使用了一元+
,并且其参数本身是一元+
调用,则在调用环境中增加相关变量
`+` <- 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
但不要这样做,因为这样会减慢速度。或者在另一个环境中这样做,确保这些指令上没有大的循环
您也可以这样做:
`++` <- function(x) eval.parent(substitute(x <- x + 1))
a <- 1
`++`(a)
a
# [1] 2
`++`我们也可以使用inplace
library(inplace)
x <- 1
x %+<-% 2
库(就地)
x如果你想在数组中使用i++
来增加索引,你可以尝试i,而不变性对于对象来说是一个很好的/理想的属性(读取:更少的bug)。我认为不变性与+=问题无关。在其他语言中+=可以应用于不可变类型(如.net中的字符串)。该操作只是创建一个新对象,并将给定变量分配给该新对象。保持不变性并更新该变量。这一点很好。不变性当然会使此类操作不那么自然。但是,该函数不能返回值,然后像postincrement++一样递增。它更类似于+=或preincrement++。错!增量的引入并不是为了简化编译器的工作。INC
指令主要是为了实现计数器而在处理器中引入的(参见《英特尔软件开发人员手册》)。我将更新答案。不,做x++=1
或x++
-x=x+1
工作。从4.1.0版开始,这些函数似乎已从Hmisc
中删除。@Llasr我正在看那个符号,我不能责怪任何人。(+1),但要提醒一句。键入x=%+=%y/2
返回x=(x+y)/2
。添加括号,即x=%+=%(y/2)
解决了这个问题。@knrumsey为什么?我猜除法会是一个更高优先级的运算符。@DavidKelley不确定。我同意你的观点。我在一个项目中遇到过这个问题,花了一个小时才找到问题。记住,你是在运行函数,而不是在进行加法。函数的优先级最高,所以没有括号,它将y解析为函数输入,除法是链的下一步。括号将(y/2)操作提升到链的顶部。
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
library(inplace)
x <- 1
x %+<-% 2