在 R 中,如何将整个命令行放入二元运算符的 sys.call() 中?
Posted
技术标签:
【中文标题】在 R 中,如何将整个命令行放入二元运算符的 sys.call() 中?【英文标题】:In R, how to get the whole command line into the sys.call() of a binary operator? 【发布时间】:2012-08-02 13:22:43 【问题描述】:我为 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”
谢谢。
【问题讨论】:
奇数;当我运行代码(R 2.15.1)时,我得到Error in a %X% 3 + 1:10 : non-numeric argument to binary operator
@DavidRobinson,错误来自+
运算符,当尝试将字符类型的a %X% 3
的输出与数字类型的1:10
相加时。
【参考方案1】:
这与运算符优先级有关,请参阅?Syntax
以获得更多帮助。它说特殊运算符 (%any%
) 像您要定义的运算符比二进制 +
具有更高的优先级,因此除了使用括号并执行 a %X% (b + c)
之外没有其他方法 (AFAIK)。
【讨论】:
出于好奇:那么<-
/=
是如何工作的?我认为它不是二元运算符
@DavidRobinson、<-
和 =
是二元运算符,优先级很低,请参阅 ?Syntax
。【参考方案2】:
我想没有办法降低自定义运算符的优先级。但是,我想我找到了一个俗气的解决方法:我可以命名我的操作员<<-
我不太明白<-
调度是如何工作的,而且<-
的不同对象特定方法肯定有几十个(methods(
) 中都没有出现。我只知道是当我覆盖<-
时,各种东西都会中断。
但是,<<-
的优先级接近于 <-
,它并不是特别有用,因为对于您确实需要从函数或循环内部编写全局变量的偶尔情况,您可以使用.GlobalEnv[['foo']] <- bar
或assign('foo',bar,env=.GlobalEnv)
。
此外,由于我最初只是尝试在 .GlobalEnv 中记录和写保护对象,因此我分配给 <<-
的新含义甚至与原来的含义有些一致。
【讨论】:
以上是关于在 R 中,如何将整个命令行放入二元运算符的 sys.call() 中?的主要内容,如果未能解决你的问题,请参考以下文章