如何在R中的公式中抑制算术运算符

时间:2017-06-01 19:00:19

标签: r formula infix-operator

我试图定义一个中缀函数%〜%,它在左边是一个字符,在右边是一个表达式,它返回一个连接的公式对象。所以我希望"y" %~% x + z返回y ~ x + z

但是,我的函数(如下)未能将+用作符号公式运算符,而是默认为算术运算符。显然,~中缀函数可以实现这一点,但它是一个原始函数,所以我(我想)不能刷代码,我也不知道如何合并它进入函数定义以实现我想要的结果。

`%~%` <- function(x, y) {

y <- deparse(substitute(y))
formula(paste(x, "~", y) 

}

解决方案是在调用函数时使用~运算符:

"y" %~%~ x + z

但我想知道是否有办法阻止在函数定义中将+评估为算术运算符,以便我可以简单地使用%~%

1 个答案:

答案 0 :(得分:1)

订单或运算符优先级在R中是固定的,一些实验(或检查?Syntax帮助页面)显示特殊运算符绑定比+-更紧密操作符:

`%~%` = function(left,right){
    cat("left: ",as.character(substitute(left)), "  right: ", as.character(substitute(right)),'\n')
    return(100)
}

产生:

> 2 %~% 1 + 3
left:  2   right:  1 
[1] 103
> 2 %~% (1 + 3)
left:  2   right:  ( 1 + 3 
[1] 100

或者可能更清楚一点:

zz <- function(x){
    x <- substitute(x)
    cat(sprintf("%s [%s] %s\n",
                             as.character(deparse(x[[2]])),
                             as.character(deparse(x[[1]])),
                             as.character(deparse(x[[3]]))))}

产生:

> zz(1 + 2)
1 [+] 2
> zz(1 + 2:3)
1 [+] 2:3
> zz(1 + 2%foo%3)
1 [+] 2 %foo% 3
> zz(2%foo%3+1)
2 %foo% 3 [+] 1

另请注意,公式会捕获创建它们的环境,因此如果不注意将正确的环境绑定到公式对象,则在辅助函数中创建公式可能会产生一些意外且难以调试的结果。