2017-06-01 13 views
0

zu unterdrücken Ich versuche, eine Infix-Funktion% ~% zu definieren, die ein Zeichen auf der linken Seite und einen Ausdruck auf der rechten Seite und ein verkettetes Formelobjekt zurückgibt. Also was ich will "y" %~% x + z zurückgeben y ~ x + z.Wie arithmetische Operatoren in einer Formel in R

Allerdings funktioniert meine Funktion (unten) nicht die + als symbolische Formeloperator verwenden und stattdessen einen arithmetischen Operator. Natürlich, die ~ Infix-Funktion erreicht dies, aber es ist eine primitive Funktion, so dass ich (glaube ich) kann nicht den Code wischen, und ich weiß nicht, wie es in die Funktionsdefinition zu integrieren, um meine gewünschten Ergebnisse zu erreichen.

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

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

} 

Eine Lösung ist es, die ~ Operator verwenden beim Aufruf der Funktion:

"y" %~%~ x + z

aber ich frage mich, ob es einen Weg gibt, die Auswertung von + als arithmetischer Operator zu verhindern die Funktionsdefinition, so dass ich einfach %~% verwenden kann.

Antwort

1

Die Reihenfolge oder Rangfolge der Operatoren ist in R, und ein wenig Experimentieren (oder Überprüfung der ?Syntax Hilfeseite) befestigt zeigt, dass die speziellen Operatoren binden enger als die + und - Operatoren:

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

welche Ausbeuten :

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

oder vielleicht deutlicher ein bisschen:

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]]))))} 

, die Ausbeuten:

> 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 

Beachten Sie auch erfassen, die Formel ist die Umgebung, in der sie erstellt werden, so dass eine Formel in einer Hilfsfunktion zu schaffen kann einige unerwartete und schwierig zu debuggen Folgen haben, wenn Sie kümmern sich nicht nehmen um die richtige Umgebung an Ihr Formelobjekt zu binden.

Verwandte Themen