Function returning unwanted multiple values

Dom

Issue

I have written a for loop to calculate income tax payable based on the variable income. From the function below I need a single value but it currently returns multiple. The right answer is in the values returned but I am having trouble writing the function so that it returns just that value.

My attempt

The Data:
df1 <- structure(list(`Taxable income` = c("$18,201 – $37,000", "$37,001 – $87,000", 
"$87,001 – $180,000", "$180,001 and over"), `Tax on this income` = c("19c for each $1 over $18200", 
"$3572 plus 32.5c for each $1 over $37000", "$19822 plus 37c for each $1 over $87000", 
"$54232 plus 45c for each $1 over $180000"), cumm_tax_amt = c(0, 
3572, 19822, 54232), tax_rate = c(19, 32.5, 37, 45), threshold = c(18200, 
37000, 87000, 180000)), class = "data.frame", row.names = c(NA, 
-4L))
The function:
tax_calc <- function(data, income) {

  #loop starts at the highest tax bracket first
  for (i in nrow(data):1) {

  #if statement checks if income above the thresholds in col 5
    if(income >= data[i,5]) {

      #the marginal income is calc'ed (i.e. $180,001 - $180,000) and multiplied by the marginal rate (i.e. $1 x 0.45)
      print(((income - data[i,5]) * (data[i,4]/100)) + data[i,3])

      #if income is not above any thresholds in col 5 then return zero
    } else {
      print(0)
    }
  }
}
My result
> tax_calc(df1, 18201)
[1] 0
[1] 0
[1] 0
[1] 0.19

> tax_calc(df1, 50000)
[1] 0
[1] 0
[1] 7797
[1] 6042

> tax_calc(df1, 180001)
[1] 54232.45
[1] 54232.37
[1] 50047.33
[1] 30742.19

What success would look like

>tax_calc(data = df1, 18201)
0.19

>tax_calc(data = df1, 50000)
7797

>tax_calc(data = df1, 180001)
54232.45
Ronak Shah

Not completely sure about the reason but based on expected output and attempt I guess you need

tax_calc <- function(data, income) {
   rev_data <- data[rev(seq_len(nrow(df1))), ]
   i <- which.max(income >= rev_data[, 5])
  ((income - rev_data[i,5]) * (rev_data[i,4]/100)) + rev_data[i,3]
}

tax_calc(df1, 18201)
#[1] 0.19 
tax_calc(df1, 50000)
#[1] 7797
tax_calc(df1, 180001)
#[1] 54232.45

We first reverse the dataframe, find the first occurrence when the 5th column has value greater than equal to income and perform the calculation on that row.

Or without reversing the dataframe we can do

tax_calc <- function(data, income) {
   i <-tail(which(income >= data[, 5]), 1)
   if (length(i) > 0) 
     return(((income - data[i,5]) * (data[i,4]/100)) + data[i,3])
   else
     return(0)
}

tax_calc(df1, 18199)
#[1] 0
tax_calc(df1, 18201)
#[1] 0.19

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Returning multiple values from function

COUNT(*) function is returning multiple values

Returning multiple values from a function in C

Returning multiple values from a C++ function

Issue returning multiple values with a tuple for a function

Returning multiple values from PL/SQL function

Python Returning multiple values into another function

Handle Max function on Null values or returning multiple values

Swift error while returning multiple values from function

Python type hints for function returning multiple return values

How to debug a Go function returning multiple values in IntelliJ?

returning multiple values from recursive function c++

Pandas - on each column apply a function returning multiple values

Returning multiple values from a function in variables using bash script

Replace for loop with vectorized call of a function returning multiple values

Returning multiple values in UDF

returning multiple values in Java

Returning multiple values of arrayList

Lua function not returning the values

R function not returning values

Returning values outside of a function

Returning Values in javascript function

Returning 2 values in a function

natrsort function not returning values

Function is not returning any values

How do I declare multiple variables instantiated by a function call returning multiple values in Go?

Is using multiple function parameters for the purpose of returning multiple values in C bad practice?

Gsheets VLOOKUP returning multiple values

SQL Query returning multiple values