2017-06-01 119 views
0

我试图定义一个中缀函数%〜%,它需要在左边输入一个字符,并在右边输入一个表达式并返回一个连接的公式对象。所以我想要"y" %~% x + z返回y ~ x + z如何在R公式中抑制算术运算符R

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

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

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

} 

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

"y" %~%~ x + z

,但我不知道是否有一种方法,以防止+评价算术运算符该函数的定义使我可以简单地使用%~%

回答

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 

还要注意公式的捕捉它们所创造的环境,因此创造了一个辅助函数的公式可能有一些意外和难以调试的后果,如果你不小心将正确的环境绑定到公式对象。