Benefit of attaching objects (you can skip this)

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

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"

Attaching operators

创建平凡的中缀运算符

请考虑以下运算符定义:

`%plus%` <- function(x,y) UseMethod("%plus%")
`%plus%.numeric` <- function(x, y) x + y
1 %plus% 1
#> 2

当然,这是为了简单起见,但人们可以通过复杂的数学来定义一个复杂的%+%.

这一问题

让我们try 连接我们的%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

推荐答案

正如用户2554330已经在 comments 中指出的那样,这个问题的出现不是因为中缀操作符,而是因为方法.您需要"注册"S3方法,否则它需要在调用泛型的环境中可用.

UseMethod的文件详细说明了这一点:

命名空间可以注册泛型函数的方法.为了支持这一点,UseMethod和NextMethod在两个地方搜索方法:在调用泛型函数的环境中,以及在定义泛型的环境(通常是命名空间)的注册数据库中.因此,泛型函数的方法需要在调用泛型的环境中可用,否则必须注册.(它们在定义类属的环境中是否可见并不重要.)

`%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

R相关问答推荐

变量计算按R中的行更改

使用R中的gt对R中的html rmarkdown文件进行条件格式设置表的单元格

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

从嵌套列表中智能提取线性模型系数

在位置周围设定一个半径并识别该半径内的其他位置

Highcharter多次钻取不起作用,使用不同方法

在不安装软件包的情况下测试更新

如何删除gggvenn与gggplot绘制的空白?

如何将移除事件分配给动态创建的按钮?

计算具有奇数日期的运行金额

使用sf或terra的LINESTRAING的累积长度

在ggplot中为不同几何体使用不同的 colored颜色 比例

如何从R ggplot图片中获取SVG字符串?

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

有没有办法使用ggText,<;Sub>;&;<;sup>;将上标和下标添加到同一元素?

如何在R中平滑地绘制线图(不拟合)?

KM估计的差异:SvyKm与带权重的调查

如果极点中存在部分匹配,则替换整个字符串

将日期列从字符转换为日期得到的结果是NAS