在Rprofile.site中覆盖*运算符以处理整数溢出

时间:2013-12-11 20:09:09

标签: r

我正在尝试将代码插入到Rprofile.site中,以允许整数乘以而不会溢出。 如果您运行此代码,请小心,它会使*运算符超载。如果你运行它,你可以将oldMult存储回[tick] [星号] [tick]以将其设置回来

当我把它放入Rprofile时如下

print("test1")
oldMult<-`*`
      `*`<-function(A,B){
        if(is.integer(A) || is.integer(B))
        {
          return(oldMult(as.numeric(A),as.numeric(B)))
        } else return (oldMult(A,B))
      }
print("test2")
.First <- function()
{
print("test3")
oldMult<-`*`
      `*`<-function(A,B){
        if(is.integer(A) || is.integer(B))
        {
          return(oldMult(as.numeric(A),as.numeric(B)))
        } else return (oldMult(A,B))
      }
print("test4")
#blah blah
}

我收到此错误

Error: cannot change value of locked binding for '*'

“test1”打印,oldMult显示为

> oldMult
function (e1, e2)  .Primitive("*")

但奇怪的是,如果我只是运行完全相同的代码

`*`<-function(A,B){
        if(is.integer(A) || is.integer(B))
        {
          return(oldMult(as.numeric(A),as.numeric(B)))
        } else return (oldMult(A,B))
      }

它运作得很好

> as.integer(1000000000) * as.integer(1000000000)
[1] 1000000000000000000

有什么不同?这与环境有关吗?

> environmentIsLocked(.GlobalEnv)
[1] FALSE
> bindingIsLocked(*,.GlobalEnv)
Error: unexpected '*' in "bindingIsLocked(*"
> bindingIsLocked("*",.GlobalEnv)
Error in bindingIsLocked("*", .GlobalEnv) : no binding for "*"
> bindingIsLocked(`*`,.GlobalEnv)
Error in bindingIsLocked(`*`, .GlobalEnv) : not a symbol

1 个答案:

答案 0 :(得分:2)

> bindingIsLocked("*", env=baseenv())
[1] TRUE

bindingIsLocked("*",environment())放在您的功能中,然后覆盖它。然后,您将看到它是否被锁定在该本地环境(environment()