2017-06-01 92 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 

還要注意公式的捕捉它們所創造的環境,因此創造了一個輔助函數的公式可能有一些意外和難以調試的後果,如果你不小心將正確的環境綁定到公式對象。