2015-09-15 3 views
0

Я возился с функциями обучения, чтобы рассчитать домашние задания (в данном случае настоящую стоимость денег), и я столкнулся с проблемой.Сохранение последовательных значений от функции до вектора?

Вот код:

pv <- function(x,y,z) { 
    list2 <- 0 
    ans <- 0 
    for(t in z){ 
    fv <- x 
    d <- y 
    rate <- (1+d)^t 
    ans[t] <- fv/rate 
    } 
    return(ans) 
} 

Для расчета текущей стоимости я хочу, чтобы применить функцию к одному значению для диапазона лет (г = 1: 10, например) и имеет значение для каждого года хранящегося в векторе. У меня есть работы, но эта стратегия ломается в других приложениях. Например, когда я хочу ввести вектор значений (у меня есть другая функция, где я запускаю вектор через функцию) в течение ряда лет у меня возникают проблемы с возвратом полезного вектора.

+0

делает то, что у вас есть работа для одного входного значения 'x'? Вы можете использовать 'sapply' для использования функции с вектором значений:' sapply (vectorOfValues, pv) ' –

+0

Хорошо, это имеет смысл. Когда я использую sapply и сохраняю значения в вектор, они будут в порядке? Я запутался в использовании sapply. – milk

+0

Да, они будут. 'sapply' используется для вставки каждого элемента вектора в функцию и возврата результата. «S» означает упрощение. Однако, 'sapply' здесь неверен, так как ваша функция имеет 3 параметра. Вам нужно использовать 'mapply', который предназначен для функций с несколькими параметрами. Попробуйте, mapply (pv, c (1000, 1200, 1500, 5600), c (.05, .02, .03, .09), 5) 'Похоже, что нижняя строка матрицы представляет собой расчет текущей стоимости (не знаю, почему это так). –

ответ

0
pv = function(fv, d, t) 
    fv/(1+d)^t 

pv(1.05^2, 0.05, c(1, 2)) 

Вот объяснение. В основном, в R, алгебраические функции применяются автоматически по числовым данным, так что цикл часто не нужен.

+0

'Vectorize()' ничего не делает. Исходная функция 'pv()' уже была векторизована. –

+0

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. –

0

я должен был внести изменения в свой цикл, то я использовал mapply:

pv <- function(x,y,z) { 
     list2 <- 0 
     ans <- 0 
     for(t in 1:z){ # changed from t in z 
     fv <- x 
     d <- y 
     rate <- (1+d)^t 
     ans[t] <- fv/rate 
     } 

    return(ans) 
} 

mapply(pv, c(1000, 1200, 1500, 5600), c(.05, .02, .03, .09), 5)

Выход:

 [,1]  [,2]  [,3]  [,4] 
[1,] 952.3810 1176.471 1456.311 5137.615 
[2,] 907.0295 1153.403 1413.894 4713.408 
[3,] 863.8376 1130.787 1372.712 4324.227 
[4,] 822.7025 1108.615 1332.731 3967.181 
[5,] 783.5262 1086.877 1293.913 3639.616 

Каждая строка содержит текущее значение для каждого значения от x за период, то есть строка 1 является текущей стоимостью за 1-й период. Если вы хотите только 5-й период для всех значений в вопросе:

mapply(pv, c(1000, 1200, 1500, 5600), c(.05, .02, .03, .09), 5)[5,]

Смежные вопросы