2012-11-24 111 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

相關問題