3

这是我的功能。它在 [-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(bins) 时,我得到了这个荒谬的答案。在 [-5,-3] 范围内是正确的。

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

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

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

4

2 回答 2

6

您必须对函数进行向量化f以使其应用于向量:

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

请注意,您也可以只使用curvewith sapply

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.

于 2012-11-24T19:14:40.247 回答
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) }
于 2012-11-24T23:56:04.527 回答