在R中创建一元运算符

在R中创建一元运算符,r,R,可以在R中创建一元运算符吗?我知道可以像这样创建二进制运算符: setGeneric("%power%", function(x, y) x ^ y) 2 %power% 4 但是是否可以创建一元运算符,如-。我试过这样的方法: setGeneric("%-%", function(x) -x) %-% 3 但是它不起作用R解析器不支持自定义一元运算符 以下站点中支持的操作员列表的副本: -减号,可以是一元或二进制 +另外,可以是一元或二元 ! 一元非 ~Tilde用于模型公式,可以是一

可以在R中创建一元运算符吗?我知道可以像这样创建二进制运算符:

setGeneric("%power%", function(x, y) x ^ y)
2 %power% 4
但是是否可以创建一元运算符,如
-
。我试过这样的方法:

setGeneric("%-%", function(x) -x)
%-% 3

但是它不起作用

R解析器不支持自定义一元运算符

以下站点中支持的操作员列表的副本:

-减号,可以是一元或二进制
+另外,可以是一元或二元
!   一元非
~Tilde用于模型公式,可以是一元或二元
?   帮助
:序列,二进制(在模型公式中:交互)
*二进制乘法
/二进制除法
^二元幂运算
%x%特殊二进制运算符,x可以替换为任何有效名称
%%二元模
%/%整数除法,二进制
%*%二元矩阵积
%o%外积,二进制
%x%Kronecker乘积,二进制
%在%匹配运算符中,二进制(在模型公式中:嵌套)
<小于,二进制
>大于,二进制
==等于,二进制
>=大于或等于,二进制

虽然我不熟悉
setGeneric
,但我可以回答这个问题

可以在R中创建一元运算符吗

是的,有点像,但不是真的。你可以假装:

#让我们使用二进制运算符定义一元运算符:
#象征/*/
-   Minus, can be unary or binary
+   Plus, can be unary or binary
!   Unary not
~   Tilde, used for model formulae, can be either unary or binary
?   Help
:   Sequence, binary (in model formulae: interaction)
*   Multiplication, binary
/   Division, binary
^   Exponentiation, binary
%x% Special binary operators, x can be replaced by any valid name
%%  Modulus, binary
%/% Integer divide, binary
%*% Matrix product, binary
%o% Outer product, binary
%x% Kronecker product, binary
%in%    Matching operator, binary (in model formulae: nesting)
<   Less than, binary
>   Greater than, binary
==  Equal to, binary
>=  Greater than or equal to, binary
<=  Less than or equal to, binary
&   And, binary, vectorized
&&  And, binary, not vectorized
|   Or, binary, vectorized
||  Or, binary, not vectorized
<-  Left assignment, binary
->  Right assignment, binary
$   List subset, binary
# LET'S USE A BINARY OPERATOR TO DEFINE A UNARY OPERATOR:
# THE SYMBOL /*/<- IS SUPPOSED TO LOOK LIKE PERCENT-WILDCARD-PERCENT--ASSIGNMENT-ARROW
`%/*/<-%` <- function ( name , FUN , safe = TRUE ) {
    `%//%` <- paste0
    NAME <- "%" %//% name %//% "%"
    PARENT <- parent.frame ()
    if ( safe && exists ( NAME , PARENT ) )
            stop ( NAME %//% " exists." )
    assign (
        x = NAME ,
        value = function ( x , ignored ) FUN ( x ) ,
        envir = PARENT ) }

.. <- NULL            # THIS IS WHAT I MEAN BY FAKING IT...
"-"    %/*/<-%    `-` # ... `%-%` IS ACTUALLY A BINARY OPERATOR....
1 %-%..               # ... IN THIS CALL, `..` IS THE SECOND ARGUMENT.
# [1] -1
1 %-%.. %-%..
# [1] 1

"t"   %/*/<-%   `t` 
m <- matrix(1:4, 2)
m
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    4
m %t%..
#      [,1] [,2]
# [1,]    1    2
# [2,]    3    4

"-"   %/*/<-%   `-` 
# Error in "-" %/*/<-% `-` : %-% exists.

i <- floor ( runif ( 9 , min = 1 , max = 10 ) )
i
# [1] 2 3 2 1 7 3 9 5 9
unique(i)
# [1] 2 3 1 7 9 5
"u"   %/*/<-%   function ( x ) sort ( unique ( x ) )
i %u%..
# [1] 1 2 3 5 7 9