在R中,如何将整个命令行放入二元运算符的sys.call()中?

bok*_*kov 6 r operator-overloading operators new-operator

我为R编写了一个二元运算符函数(即一个名称类似的函数,%X%以便不必键入%X%(a,b)我就可以使用更方便的语法a %X% b.我的目标是有一个包装器来<-执行诸如记录对象中的对象所做的事情.环境并检查"protected"属性,该属性会在覆盖该对象之前警告用户.

所有这一切都有效,除非我尝试做一些类似于a %X% b + c函数内部的事情你所看到的就是a %X% b_而且这也是它所做的一切; a被赋值为b,c被完全忽略.但是a %X% (b + c)这样做是有效的,%X%(a, b + c)但是将它写成二元运算符的全部意义在于避免使用括号.

如果我覆盖<-,它会sys.call()看到它左右两侧的所有内容.为什么我的只看到命令行中的相邻名称?

这是复制此问题的代码:

`%X%` <- function(...){
    print(deparse(sys.call()));
}

a %X% 3 + 1:10;
Run Code Online (Sandbox Code Playgroud)

期望的结果是"a%X%3 + 1:10"观察到的结果是"a%X%3"

谢谢.

flo*_*del 6

这与运算符优先级有关,请参阅?Syntax更多帮助.它说%any%像你想要定义的特殊运算符()具有比二进制更高的优先级+,所以除了使用括号和do之外没有其他方式(AFAIK)a %X% (b + c).


bok*_*kov 2

我想没有办法降低自定义运算符的优先级。然而,我想我找到了一个俗气的解决方法:我可以命名我的操作员 <<-

我真的不明白<-调度是如何工作的,并且必须有数十种不同的特定于对象的方法<-(其中没有一个出现在methods(<-中)。我所知道的是,当我重写<-各种东西时,就会中断。

但是,<<-的优先级接近 的优先级<-,并且它并不是特别有用,因为对于偶尔确实需要从函数或循环内部编写全局变量的情况,您可以只使用.GlobalEnv[['foo']] <- barassign('foo',bar,env=.GlobalEnv)

此外,由于我首先只是尝试在 .GlobalEnv 中记录和写保护对象,所以我分配的新含义<<-甚至与原始含义有些一致。