Каков наилучший способ написать функцию в R, где вывод зависит от аргумента? - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу написать функцию, которая рассчитывает подоходный налог в Великобритании, возможно, внутри пакета. Точная формула меняется регулярно, скажем, каждый год, но вместо того, чтобы писать новую функцию каждый раз, когда она меняется, я хочу использовать аргумент 'year', который управляет поведением функции. Так, например:

income_tax(x = '25000', year = '2019/20')

, где x - вектор доходов, а год определяет применяемые налоговые правила.

Каков наилучший способ организации и управления этой функцией, учитывая, что Формула для каждого года может быть довольно сложной, и новые обновления будут добавляться каждый год?

Есть ли объектно-ориентированное решение? Или написать внутренние функции внутри каждого года и некоторые if / else logi c внутри основной функции?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

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

0 голосов
/ 15 апреля 2020

Это немного мета-вопрос, поскольку он не указывает c на R, но ... Я представляю, что, хотя годы разные, есть некоторые общие части (по форме, даже если нет) во всех деталях) до нескольких лет. Мне бы хотелось иметь список функций (по одной в год), которые вызываются income_tax, и они, в свою очередь, выполняются на заказ, но могут вызывать обычную функциональность:

year_fns <- list(
`2019/20` = function(x, ...) {
   taxable <- post_allowance(x, 11000)
   # now some bespoke stuff for this year
   if (taxable > 100e3 ){
     ...
   }
   ....
   final_value
},
`2020/21` = #another function 
...
)

post_allowance  <- function(x, allowance) {
# some common functionality
}

и тогда вы ' Просто рассчитайте подоходный налог с помощью

income_tax <- function(x, year, ...) {
   year_fns[[year]](x, ...)
}

. К этому может потребоваться некоторое привыкание, но прелесть R в том, что с функциями так же легко работать, как с числами, строками и c. Итак, мы ищем правильную функцию для вызова в части year_fns[[year]], а затем вызываем эту функцию с (x,...) part

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...