gpt4 book ai didi

r - 是否可以在没有 %% 的情况下定义运算符?

转载 作者:行者123 更新时间:2023-12-04 02:58:45 25 4
gpt4 key购买 nike

在 R 中允许用户定义运算符,但似乎只有 % %像运营商一样被接受。是否可以绕过此限制来定义运算符,例如 >> ,或其他类似的东西 % % ?

运算符必须是真正的运算符,以便我们可以像 1 >> 2 一样使用它并且不必像 ">>"(1,2) 那样使用它.

最佳答案

不,R 只允许你

  • 重新定义现有的运算符(例如 `+` 或实际上是 `<-` )和
  • 通过用 %…% 包围它们来定义新的中缀运算符.

  • 这些是我们必须遵守的规则。然而,在这些规则中,一切都是公平的。例如,我们可以重新定义 `+`对字符串进行拼接,不破坏其正常含义(加法):
    `+`
    # function (e1, e2) .Primitive("+")
    这是旧的定义,我们希望为数字保留:
    `+.default` = .Primitive('+')
    `+.character` = paste0`1
    `+` = function (e1, e2) UseMethod('+')
    1 + 2
    # [1] 3
    'hello' + 'world'
    # [1] "helloworld"
    这利用了 R 中的 S3 类系统来制作 `+`在其第一个参数的类型上完全通用。
    因此可以重新定义的运算符列表非常不拘一格。乍一看,它包含以下运算符:

    +, -, *, /, ^, &, |, :, ::, :::, $, =, <-, <<-, ==, <, <=, >, >=, !=, ~, &&, ||, !, ?, @, :=, (, {, [, [[

    (From the {modules} source code.)


    在这个列表中,一个特殊的运算符值得注意: `:=`是一个可覆盖的运算符(例如 {data.table} 使用它),但与此列表中的大多数其他运算符不同,它没有默认实现。
    类似地,您可以定义几乎每个运算符的赋值版本,而不仅仅是那些具有预定义赋值的运算符(例如 `[<-` )。例如, `(<-``{<-`也缺少默认实现。这就是以下代码失败的原因:
    a = 1
    (a) = 2
    # Error in (a) = 2 : could not find function "(<-"
    {a} = 3
    # Error in { : could not find function "{<-"
    但是可以通过定义运算符来使代码工作:
    `(<-` = `{<-` = function (x, value) value
    这同样适用于每个函数,包括几乎所有的运算符1,甚至控制结构(请参阅此答案下方的注释)。
    相比之下, `**`不是真正的运算符:它是 `^` 的语法别名.用户可以自己定义 `**`函数但不能通过代码 a ** b调用所以它不是一个可覆盖的运算符(除了通过覆盖 `^` )。
    同样,您可以覆盖 -> (仅)通过重新定义 <- .这似乎几乎没有意义——但至少存在一个很好的例子,定义不那么冗长的 lambdas:
    > sapply(1 : 4, x -> 2 * x)
    [1] 2 4 6 8
    Implementation as a gist

    1 唯一的异常(exception)是赋值运算符:您不能更改 a <- b <- c 的含义。通过重新定义 `<-<-` (与 `=<-``<<-``:=` 相同),由于语言的 operator precedence and associativity rules .但是,以下代码同时调用了 `(<-``<-<-` ,如果未定义其中任何一个,则失败:
    (a <- b) <- c
    弄乱。

    关于r - 是否可以在没有 %% 的情况下定义运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24697248/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com