Как мне написать инфиксную функцию? - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь написать инфиксную функцию с именем% #%, которая будет работать с двумя векторами x и y.Операция x% #% y должна возвращать вектор такой же длины, что и x и y.Элемент i возвращаемого вектора должен быть x [i] + y [i], если x [i]> 0, и y [i]> 0, 0, если x [i]> 0 и y [i] <0 или если x[i] <0 и y [i]> 0, и -x [i] -y [i], если x [i] <0 и y [i] <0.Ошибка должна быть возвращена, если векторы имеют разную длину.</p>

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 Ответ

1 голос
/ 27 сентября 2019

Я рекомендую:

  • не использовать #, поскольку этот символ зарезервирован для комментариев в R
  • использовать векторизованный подход
  • подумать о том, что следуетпроизойдет, если x или y равны нулю

Вы можете попробовать что-то вроде:

`%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
...