R中公式中的算术算子的求逆

R中公式中的算术算子的求逆,r,formula,infix-operator,R,Formula,Infix Operator,我试图定义一个中缀函数%~%,该函数在左侧接受一个字符,在右侧接受一个表达式,并返回一个连接的公式对象。因此,我希望“y”%~%x+z返回y~x+z 但是,我的函数(如下)未能将+用作符号公式运算符,而是默认为算术运算符。显然,~中缀函数实现了这一点,但它是一个原始函数,因此我(认为我)无法滑动代码,我不知道如何将其合并到函数定义中以实现我想要的结果 `%~%` <- function(x, y) { y <- deparse(substitute(y)) formula(past

我试图定义一个中缀函数%~%,该函数在左侧接受一个字符,在右侧接受一个表达式,并返回一个连接的公式对象。因此,我希望
“y”%~%x+z
返回
y~x+z

但是,我的函数(如下)未能将
+
用作符号公式运算符,而是默认为算术运算符。显然,
~
中缀函数实现了这一点,但它是一个原始函数,因此我(认为我)无法滑动代码,我不知道如何将其合并到函数定义中以实现我想要的结果

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

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

}

`%~%`R中的顺序或运算符优先级是固定的,少量实验(或检查
?语法
帮助页)表明,特殊运算符比
+
-
运算符绑定得更紧:

`%~%` = 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(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
或者更清楚一点:

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]]))))}
还请注意,公式捕获了创建它们的环境,因此,如果不注意将正确的环境绑定到公式对象,则在助手函数中创建公式可能会产生一些意外且难以调试的结果