【问题标题】:How to supress arithmetric operators in a formula in R如何在R中的公式中抑制算术运算符
【发布时间】:2017-06-01 19:00:19
【问题描述】:

我正在尝试定义一个中缀函数 %~%,它在左边接受一个字符,在右边接受一个表达式,并返回一个连接的公式对象。所以我想要"y" %~% x + z 返回y ~ x + z

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

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

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

}

一个解决办法是在调用函数时使用~操作符:

"y" %~%~ x + z

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

【问题讨论】:

    标签: r formula infix-operator


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多