R是否有+=
(加上等于)或++
(加上加号)作为c ++ / c#/其他人的概念?
答案 0 :(得分:92)
不,它没有,请参阅:R Language Definition: Operators
答案 1 :(得分:55)
关注@GregaKešpret,您可以创建一个中缀运算符:
`%+=%` = function(e1,e2) eval.parent(substitute(e1 <- e1 + e2))
x = 1
x %+=% 2 ; x
答案 2 :(得分:30)
R没有increment operator
的概念(例如C中的++)。但是,自己实现一个并不困难,例如:
inc <- function(x)
{
eval.parent(substitute(x <- x + 1))
}
在这种情况下,你会打电话给
x <- 10
inc(x)
然而,它引入了函数调用开销,因此它比自己键入x <- x + 1
慢。如果我没有弄错increment operator
是为了让编译器工作更容易,因为它可以直接将代码转换为那些机器语言指令。
答案 3 :(得分:15)
R没有这些操作,因为R中的(大多数)对象是不可变的。他们不会改变。通常,当您看起来正在修改对象时,您实际上是在修改副本。
答案 4 :(得分:14)
增加和减少10。
require(Hmisc)
inc(x) <- 10
dec(x) <- 10
答案 5 :(得分:3)
我们发布了一个包装程序,即绳索器,以帮助解决此类问题。您可以在这里了解更多信息:https://happylittlescripts.blogspot.com/2018/09/make-your-r-code-nicer-with-roperators.html
import os
def get_list():
return os.listdir('/etc/app_data/')
答案 6 :(得分:2)
我们可以覆盖+
。如果使用一元+
,并且其参数本身是一元+
调用,则在调用环境中增加相关变量。
`+` <- 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
答案 7 :(得分:0)
还有另一种方法,我发现这很容易,也许会失去一些帮助
在这种情况下,我使用<<-
运算符<<-
将该值分配给父环境
inc <- function(x)
{
x <<- x + 1
}
您可以这样称呼
x <- 0
inc(x)
答案 8 :(得分:0)
我们也可以使用inplace
library(inplace)
x <- 1
x %+<-% 2
答案 9 :(得分:0)
如果想在数组中使用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
因为 =
和 <-
并不总是等价的,如?`<-`