R:如果要在"重载"代码中使用`-`,如何重载`-`运算符?

xia*_*dai 9 recursion overloading r

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

some.string - n
Run Code Online (Sandbox Code Playgroud)

将删除最后n个字符的some.string.

这是我在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
Run Code Online (Sandbox Code Playgroud)

然而,这似乎导致无限嵌套的递归.这是因为每次减去运行它都会尝试自行运行.但这正是我试图通过首先分配minus =来防止的-

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

sha*_*dow 12

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

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

更接近您最初的想法是定义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))
  }
}
Run Code Online (Sandbox Code Playgroud)