从R中的标量函数创建向量函数

时间:2012-11-24 19:10:26

标签: r

这是我的功能。它需要[-5,-3]和[3,5]的某些值以及其他地方的0。该函数围绕原点对称。

f<-function(x){
    y=0 
    if (x>=-5 && x<=-3){
        y=3*(1-(x+4)^2)/8
    }
    if (x>=3 && x<=5){
        y=3*(1-(x-4)^2)/8
    }
    return(y)
}

好的,我使用了函数sapply (bins, f)

其中bins = seq(-5,5,by=0.05)。这很好用!

但是当我尝试做f(箱子)时,我得到了这个荒谬的答案。对于[-5,-3]范围是正确的。

我的猜测是,当函数f检查第一个if条件时,它只检查了bin向量的第一个值,所以对于(-3,5)范围,它错误地使用了仅用于[-5,-3]。

我试图找到一种为这些点绘制曲线的方法,但是当我使用曲线函数时,使用f(bins)得到的错误值绘制曲线

有人可以告诉我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:6)

您需要Vectorize函数f才能将其应用于向量:

f = Vectorize(f)
print(f(bins))

请注意,您也可以将curvesapply一起使用:

curve(sapply(x, f), from=-5, to=5)

最后,如果您使用ifelse编写函数,如下所示:

f = function(x) {
    ifelse(x >= -5 & x <= -3, 3*(1-(x+4)^2)/8, ifelse(x>=3 & x<=5, 3*(1-(x-4)^2)/8, 0))
}

这样就可以在不需要Vectorize的情况下处理向量。

答案 1 :(得分:3)

编写函数会快得多,所以它完全被矢量化了:

f <- function(x){  0 + (x >=-5 & x <= -3)*(3*(1-(x+4)^2)/8) +
                   + (x >= 3 & x <= 5)*( 3*(1-(x-4)^2)/8) }

从对称性来看,可以进一步简化(我认为):

f <- function(x){  0 + ( abs(x) <= 5 & abs(x) >= 3)*( 3*(1-(abs(x) -4)^2)/8) }