繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM