R语法,加班费

时间:2017-09-28 21:16:08

标签: r syntax

我是计算机科学专业的学生,​​并且已经学习了更多关于如何使用python的知识,现在正在学习R.我不习惯R,而且我已经想出如何计算加班费,但我不是确定我的语法有什么问题:

computePay <- function(pay,hours){
}if (hours)>=40{
newpay = 40-hours
total=pay*1.5
return(pay*40)+newpay*total
}else{
return (pay * hours)
}

我如何正确编码?

2 个答案:

答案 0 :(得分:2)

您的“newpay * total”表达式位于return命令之外。你需要把它放在括号内。第二行开头的末端括号应移动到最后一行。你也应该有“(小时&gt; = 40)”而不是“(小时)&gt; = 40”。在风格上,变量名称选择不当而且没有缩进(这可能会帮助您注意错位的括号)。此外,计算可以简化:

total_pay = hourly_wage*(hours+max(0,hours-40)/2))

你工作的每一个小时,你得到你的小时工资。对于超过40小时的每小时,您可以获得每小时工资加上每小时工资的一半。所以总工资是工资*(总工时+(小时数超过40)/ 2)。超过40小时要么是总小时减去40,要么是零,以较大者为准。

答案 1 :(得分:2)

不看矢量化之类的东西,直接修正你的函数会看起来像:

computePay <- function(pay,hours) {
  if (hours >= 40) {
    newpay = hours - 40
    total = pay * 1.5
    return(pay*40 + newpay*total)
  } else {
    return(pay * hours)
  }
}

这支持使用单个pay和单个hours调用该函数。你错误地计算了newpay(真的应该命名为overhours),我纠正了它。

你可能会听到人们谈论“避免魔法常数”。 “魔术常量”是代码中的硬编码数字,它不是非常清晰和/或可能有助于调用者修改。例如,在某些合同中,加班可能是从40以外的数字开始,因此可能是可配置的。您可以通过将形式更改为:

来实现
computePay <- function(pay, hours, overtime_hours = 40, overtime_factor = 1.5)

并使用这些变量而不是硬编码的数字。这允许用户指定其他值,但如果没有提供,则他们采用合理的默认值。

此外,使用一个或另一个向量调用它可能很有用,在这种情况下,当前函数将失败,因为if (hours >= 40)需要单个逻辑值,但(例如)c(40,50) >= 40返回长度为2的逻辑向量。我们通过引入ifelse函数来做到这一点。虽然它有一些高级用法的问题,但它应该在这里工作得很好:

computePay1 <- function(pay, hours, overtime_hours = 40, overtime_factor = 1.5) {
  ifelse(hours >= overtime_hours,
         overtime_hours * pay + (hours - overtime_hours) * overtime_factor * pay,
         pay * hours)
}

由于一些陷阱和深层嵌套的可读性(我已经看到ifelse堆叠了12层),有些人更喜欢其他解决方案。如果你仔细观察它,你可能会发现你可以进一步利用向量化和pmaxmax在每个元素上逐段应用max(c(1,3,5), c(2,4,4))。 (请注意pmax(c(1,3,5), c(2,4,4))computePay2 <- function(pay, hours, overtime_hours = 40, overtime_factor = 1.5) { pmax(0, hours - overtime_hours) * overtime_factor * pay + pmin(hours, overtime_hours) * pay } 的区别。)

尝试这样的事情:

pmax

为了说明这是如何运作的,我将展开pminhours <- c(20, 39, 41, 50) overtime_hours <- 40 pmax(0, hours - overtime_hours) # [1] 0 0 1 10 pmin(hours, overtime_hours) # [1] 20 39 40 40 组件:

JOIN

其他人自行解决。