2012-02-05 53 views
2

我是R中的新手,並試圖理解處理而不是循環的矢量方式。我需要幫助,瞭解如何使用外部函數和用戶定義函數創建值表。使用外部函數來獲取由用戶定義的函數返回的值表

下面是一個簡單的函數,它給出了一個平凡的債券

bp = function(y, n=1, c=0, fv=100, freq=2){ 
    per = 1:(n*freq) 
    cf = rep(c/freq, n*freq) 
    cf[length(cf)] = cf[length(cf)] + fv 
    df = 1/(1+y/freq)^per 
    cf %*% df 
} 

我想創建債券價格的表產量的向量的代價,N和C的給定值。像

ylds = c(0.05, 0.07, 0.08) 
n = c(1, 5, 10, 15, 20,30) 
price_table = outer(ylds, n, bp, c=9) 

有些事情我預期的價格18(3×6)矩陣/數組,但我得到這個錯誤

###### Start of Error Message 

Error in rep(c/freq, n * freq) : invalid 'times' argument 

In addition: Warning message: 

In 1:(n * freq) : numerical expression has 18 elements: only the first used 

#### End of Error Message 

我在做什麼錯?我如何得到理想的答案?

請幫忙。

問候

ķ

+0

需要進行向量化'bp'使得如果'y'和'N'具有相同的長度,然後'bp的(Y,N,CV,FV,頻率)的矢量'給出了載體還的相同的長度。 – 2012-02-05 19:13:39

+0

'外部'只適用於'vectorized'功能。你的功能不是,這就是失敗的原因。 – Ramnath 2012-02-05 19:17:45

回答

3

outer期待您的功能進行量化。正如它寫的,只有在n是標量時使用bp纔有意義。你可以重寫你的bp函數,或者你可以利用Vectorize函數來爲你做這件事。

bp = function(y, n=1, c=0, fv=100, freq=2){ 
    per = 1:(n*freq) 
    cf = rep(c/freq, n*freq) 
    cf[length(cf)] = cf[length(cf)] + fv 
    df = 1/(1+y/freq)^per 
    cf %*% df 
} 

# outer needs the function to be vectorized 
# So we ask Vectorize to do this for us. 
bpvec <- Vectorize(bp) 
ylds = c(0.05, 0.07, 0.08) 
n = c(1, 5, 10, 15, 20,30) 
price_table = outer(ylds, n, bpvec, c=9) 
+0

@kishore - 這個答案有什麼問題嗎?如果不是,你會考慮接受它嗎? http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Dason 2012-11-11 18:42:17

相關問題