использование внешней функции для получения таблицы значений, возвращаемых определенной пользователем функцией - PullRequest
2 голосов
/ 05 февраля 2012

Я новичок в 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 цен (3x6), но я получаю эту ошибку

###### 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

Что я делаю не так? И как мне получить желаемый ответ?

Пожалуйста, помогите.

привет

K

1 Ответ

3 голосов
/ 05 февраля 2012

outer ожидает, что ваша функция будет векторизована.Как написано, имеет смысл использовать bp только тогда, когда n является скаляром.Вы можете переписать свою функцию 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)
...