优雅的增量运算符作为管道

时间:2015-06-12 18:02:50

标签: r operators increment pipeline

library(magrittr)
x <- 2
x %<>% 
  add(3) %>% 
  subtract(1)
x

是否有预定义的更易读的方式可以使用管道?

也许像x %+=% 3 %-=% 1

1 个答案:

答案 0 :(得分:5)

简短回答

没有

答案很长

增加操作符很容易:

%+=% <- function (x, inc) x + inc
%-=% <- function (x, dec) x - dec

但是,这些函数不会直接修改x,因为R会非常努力地阻止函数修改其范围之外的变量。也就是说,您仍然需要编写x <- x %+=% 1来实际更新x

inc<-中的dec<-Hmisc函数可以解决此限制。因此,您可能会惊讶地发现inc<-的定义只是:

function (x, value) 
{
    x + value
}

也就是说,函数内部的代码与我们的自定义%+=%运算符中的代码完全相同。神奇的发生是因为R解析器中的一个特殊功能,它解释了

inc(x) <- 1

作为

x <- `inc<-`(x, 1)

这就是你能够做names(iris) <- letters[length(iris)]之类的事情。

%<>%很神奇,因为它会在其范围之外修改x。它也非常反对R的编码范式*。因此,所需的机器很复杂。要按照您的方式实施%+=%,您需要对%<>%进行反向工程。不过,可能值得在GitHub上提出功能请求。

*除非您是data.table用户,否则无论如何都不会对您抱有希望。