这是我的功能.它需要[-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)得到的错误值绘制曲线
有人可以告诉我如何解决这个问题吗?
您必须对函数进行矢量化f以使其应用于矢量:
f = Vectorize(f)
print(f(bins))
Run Code Online (Sandbox Code Playgroud)
请注意,您可能也只用curve带sapply:
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.