如何在R中的公式中替代算术运算符



我正在尝试定义一个infix函数%〜%,该函数〜%〜%在左侧和右侧表达式并返回一个串联的公式对象。因此,我希望"y" %~% x + z返回y ~ x + z

但是,我的功能(下(无法将+用作符号公式运算符,而是默认为算术运算符。显然,~ Infix函数可以实现这一点,但这是一个原始的函数,所以我(认为我(不能刷新代码,并且我不知道如何将其纳入功能定义中以达到我所需的结果。

`%~%` <- function(x, y) {
y <- deparse(substitute(y))
formula(paste(x, "~", y) 
}

一个解决方案是在调用函数时使用~操作员:

"y" %~%~ x + z

但是我想知道是否有一种方法可以防止+作为函数定义中的算术运算符评估,以便我可以简单地使用%~%

订单或操作员优先级是固定在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] %sn",
                             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

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

最新更新