Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:+;=(加等于)和++;c+的(加上)等价物+/c#/java等。?_R_Operators_Variable Assignment_Increment - Fatal编程技术网

R:+;=(加等于)和++;c+的(加上)等价物+/c#/java等。?

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中的(大多

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中的(大多数)对象是不可变的。它们不会改变。通常,当看起来你在修改一个对象时,实际上你在修改一个副本。

遵循@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