如何编写中缀函数?

时间:2019-09-26 23:21:07

标签: r infix-operator

我正在尝试编写一个名为%#%的中缀函数,该函数将在两个向量x和y上运行。 x%#%y操作应返回与x和y长度相同的向量。 如果x [i]> 0和y [i]> 0,则返回向量的元素i应该为x [i] + y [i];如果x [i]> 0且y [i] <0或x [i] <0和y [i]> 0,如果x [i] <0和y [i] <0,则-x [i] -y [i]。如果向量的长度不同,则应返回错误。

x <- rnorm(10)
y <- rnorm(10)
'%#%' <- function(x,y) { 
for (i in 1:10)
{
if (x[i]>0 & y[i]>0) paste(x[i]+y[i])
if (x[i]>0 & y[i]<0) paste(0)
if (x[i]<0 & y[i]>0) paste(0)
if (x[i]<0 & y[i]<0) paste(-x[i]-y[i]) 
else stop("Vectors have different lengths")
}}
x%#%y

它一直在给我错误消息。

1 个答案:

答案 0 :(得分:1)

我建议:

  • 请勿使用#,因为此符号保留用于R中的注释
  • 使用向量化方法
  • 考虑如果xy为零会发生什么情况

您可以尝试一些方法:

`%ooo%` <- function(x,y) { 
    if(length(x)!=length(y))
        stop("Vectors have different lengths")
    tmp <- ifelse(x>0 & y>0, x+y, -x-y)
    tmp[(x>0 & y<0) | (x<0 & y>0)] <- 0
    tmp
}

x <- rnorm(10)
y <- rnorm(10)

rep(1, 5) %ooo% rep(1, 6)
## Error in rep(1, 5) %ooo% rep(1, 6) : Vectors have different lengths

rep(1, 5) %ooo% -2:2
## [1]  0  0 -1  2  3