2012-11-24 45 views
3

这里是我的功能。它在其他地方的[-5,-3]和[3,5]和0上需要一定的值。该功能是围绕原点对称的。从一个标量函数R中创建一个向量函数

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(箱),我得到这个荒谬的答案。这是正确的[-5,-3]范围。

我的猜测是,当函数f检查第一个条件时,它仅检查了第一个值的矢量,所以对于(-3,5]范围,它错误地只使用公式为[-5,-3]。

我想获得的方式来绘制这些点的曲线,但是当我使用的曲线函数,曲线绘制使用了错误的值,我们会得到通过使用F(箱)

可有人请告诉我如何解决这一问题?

+0

你的猜测是正确的。如果你使用了&而不是&&以上就会清楚(if语句会产生一个警告)。请注意,您必须使用&为下面的ifelse解决方案。 –

回答

6

你将不得不Vectorize功能f让我吨至应用在矢量:

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

请注意,您可能也只用curvesapply

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

+0

我正要发布'ifelse'解决方案。你的错误 - 最后的'其他'值应该为0. –

+0

非常正确:修正 –

+0

非常感谢。 – Lost1

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) } 
+1

这是非常接近的'ifelse'的解决方案,但我觉得它更容易阅读。 –

+0

@DWin非常感谢! – Lost1

相关问题