我正在尝试将代码插入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
> bindingIsLocked("*", env=baseenv())
[1] TRUE
在覆盖bindingIsLocked("*",environment())
之前,将其放入函数中。然后,您将看到它是否锁定在本地环境(environment()
)