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

Los*_*st1 3 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)
}
Run Code Online (Sandbox Code Playgroud)

好的,所以我使用了这个功能 sapply (bins, f)

哪里bins = seq(-5,5,by=0.05).这很好用!

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

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

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

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

Dav*_*son 6

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

f = Vectorize(f)
print(f(bins))
Run Code Online (Sandbox Code Playgroud)

请注意,您可能也只用curvesapply:

curve(sapply(x, f), from=-5, to=5)
Run Code Online (Sandbox Code Playgroud)

最后,如果你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))
}
Run Code Online (Sandbox Code Playgroud)

这将允许它在不需要的情况下处理向量Vectorize.