只是为了好玩,我正在尝试重载R中的-,以便运行

some.string - n

将给我some.string并删除最后n个字符。

这是我在R中的代码
`-` <- function(x,y) {
  minus <- force(`-`)
  if(typeof(x) == "character" & y >0) {
    return(substr(x,1,minus(nchar(x), as.integer(y))))
  } else {
    return(minus(x,y))
  }
}

"abc" - 2

但是,这似乎会导致无限嵌套的递归。这是因为每次运行减号时,它都会尝试自行运行。但这恰恰是我试图通过首先分配minus = -来防止的事情?

如何避免这种无休止的递归?

最佳答案

您可以使用.Primitive("-")避免无限循环。这应该工作:

`-` <- function(x,y) {
  if(typeof(x) == "character" & y >0) {
    return(substr(x, 1, nchar(x) - as.integer(y)))
  } else {
    .Primitive("-")(x, y)
  }
}

与您的最初想法更接近的是定义minus <- get("-", envir=baseenv()):
`-` <- function(x,y) {
  minus <- get("-", envir=baseenv())
  if(typeof(x) == "character" & y >0) {
    return(substr(x,1,minus(nchar(x), as.integer(y))))
  } else {
    return(minus(x,y))
  }
}

关于R:如果要在 `-`代码中使用 `-`,如何重载 'overload'运算符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26032387/

10-12 18:52