在 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)。

【讨论】:

出于好奇:那么&lt;-/= 是如何工作的?我认为它不是二元运算符 @DavidRobinson、&lt;-= 是二元运算符,优先级很低,请参阅 ?Syntax【参考方案2】:

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

我不太明白&lt;- 调度是如何工作的,而且&lt;- 的不同对象特定方法肯定有几十个(methods() 中都没有出现。我只知道是当我覆盖&lt;- 时,各种东西都会中断。

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

此外,由于我最初只是尝试在 .GlobalEnv 中记录和写保护对象,因此我分配给 &lt;&lt;- 的新含义甚至与原来的含义有些一致。

【讨论】:

以上是关于在 R 中,如何将整个命令行放入二元运算符的 sys.call() 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个命令行参数的值放入列表中

错误:二元运算符的非数字参数

二元关系的关系的闭包

vi/vim命令

在dos命令中set/a二元运算符啥意思?

y - ymean 中的错误:二元运算符 randomForest R 的非数字参数