附加中缀运算符

问题描述 投票:0回答:1

附加物体的好处(你可以跳过这个)

在源脚本中,可以很方便地定义我们的辅助函数,如下所示:

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
r namespaces operators infix-operator r-environment
1个回答
0
投票

您需要在

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

© www.soinside.com 2019 - 2024. All rights reserved.