在源脚本中,可以很方便地定义我们的辅助函数,如下所示:
f <- function() print('hi')
e <- new.env()
assign("f", f, e)
rm(f)
attach(e)
rm(e)
现在,
f
受到了某种程度的保护。它不会扰乱您的全球环境:
ls()
#> character(0) # if anything, no "f"
rm(f)
#> In rm(f) : object 'f' not found
但是
e
仍然在搜索路径上:
search()
#> [1] ".GlobalEnv" "e" ... etc
所以:
f()
#> [1] "hi"
此外,如果我们在全局环境中定义另一个
f
,它会优先,但附加的函数会被保护不被删除:
f <- function() print('hello')
f()
#> [1] "hello"
rm(f)
f()
#> [1] "hi" # again
要实际删除
f
删除(分离)其容器:
detach(e)
f()
#> Error in f() : could not find function "f"
考虑以下运算符定义:
`%plus%` <- function(x,y) UseMethod("%plus%")
`%plus%.numeric` <- function(x, y) x + y
1 %plus% 1
#> 2
当然,这是为了简单起见,但人们可以定义复杂的
%+%
做困难的数学。
让我们尝试附加我们的
%plus%
运算符:
e <- new.env()
assign("%plus%.numeric", `%plus%.numeric`, e)
assign("%plus%", `%plus%`, e)
rm(`%plus%.numeric`)
rm(`%plus%`)
attach(e)
1 %plus% 1
给出:
Error in UseMethod("%plus%") :
no applicable method for '%plus%' applied to an object of class "c('double', 'numeric')"
有趣的是,操作员是可见的:
`%plus%`
#> function(x,y) UseMethod("%plus%")
#> <bytecode: 0x557b338c86c0>
`%plus%.numeric`
#> function(x, y) x + y
使用函数形式而不是中缀形式确实有效:
`%plus%.numeric`(1, 1)
#> 2
您需要在
e
中注册S3方法:
`%plus%` <- function(x,y) UseMethod("%plus%")
`%plus%.numeric` <- function(x, y) x + y
e <- new.env()
assign("%plus%.numeric", `%plus%.numeric`, e)
assign("%plus%", `%plus%`, e)
# this line is new
registerS3method("%plus%","numeric","%plus%.numeric", envir = e)
rm(`%plus%.numeric`)
rm(`%plus%`)
attach(e)
1 %plus% 1
#> [1] 2
创建于 2024-01-28,使用 reprex v2.0.2