6

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

所有这些都有效,除了如果我尝试在函数内部做一些事情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;

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

谢谢。

4

2 回答 2

6

这与运算符优先级有关,请参阅?Syntax获取更多帮助。它说%any%像您要定义的特殊运算符 ( ) 比 binary 具有更高的优先级+,因此除了使用括号和 do 之外,您没有其他方法 (AFAIK) a %X% (b + c)

于 2012-08-05T03:07:45.657 回答
2

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

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

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

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

于 2012-08-05T06:21:21.303 回答