R 函数返回不需要的多个值 问题

R 函数返回不需要的多个值 问题,r,for-loop,purrr,R,For Loop,Purrr,我已经编写了一个for循环,用于根据可变收入计算应缴纳的所得税。从下面的函数中,我需要一个值,但它当前返回多个值。正确的答案在返回的值中,但是我在编写函数以便它只返回该值时遇到了问题 我的尝试 数据: 成功会是什么样子 不完全确定原因,但基于预期输出和尝试,我想您需要 tax_calc <- function(data, income) { rev_data <- data[rev(seq_len(nrow(df1))), ] i <- which.max(inco

我已经编写了一个for循环,用于根据可变收入计算应缴纳的所得税。从下面的函数中,我需要一个值,但它当前返回多个值。正确的答案在返回的值中,但是我在编写函数以便它只返回该值时遇到了问题

我的尝试 数据: 成功会是什么样子
不完全确定原因,但基于预期输出和尝试,我想您需要

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

remove-else语句应该修复第一个语句。但是,如果您只需要1个响应,为什么要运行循环?通常,您应该使用函数
返回
结果,而不仅仅是
打印
结果。对于18199以下的收入值,使用文章中的最后一个公式,函数返回的是
数值(0)
。有没有一个简单的方法来解决这个问题?@Dom是的,我们可以检查在
i
中是否找到任何索引。更新了答案。
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)
    }
  }
}
> 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
>tax_calc(data = df1, 18201)
0.19

>tax_calc(data = df1, 50000)
7797

>tax_calc(data = df1, 180001)
54232.45
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
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