我想写一个函数来计算英国的所得税,可能在包装内。精确的公式每年都会定期更改,但我不想使用每次更改都会编写新函数的方法,而是要使用参数“ year”来控制函数的行为。因此,例如:
income_tax(x ='25000',year ='2019/20'),其中x是收入的向量,年份指定要应用的税收规则。
考虑到每年的公式可能非常复杂,并且每年都会增加新的更新,因此组织和管理此功能的最佳方法是什么?
是否有面向对象的解决方案?还是每年在内部编写内部函数,在主函数内部编写一些if / else逻辑?
这是一个元问题,因为它不是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的优点是函数像数字,字符串等一样易于处理。因此,我们正在寻找正确的函数以在year_fns[[year]]
部分中进行调用,然后使用(x,...)
部分调用该函数
在R中,您可以传递表达式(或表达式的一部分),就像数字和字符串一样,这意味着它们可以作为函数调用中的参数进行部署。函数expression()最有可能满足您的需求。