[英]Create a vector function from a scalar function in 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)
功能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))
请注意,您也可以使用sapply
curve
:
curve(sapply(x, f), from=-5, to=5)
最后,如果您使用ifelse
编写函数, 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
情况下处理向量。
编写函数会快得多,所以它完全被矢量化:
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) }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.