我是计算机科学专业的学生,并且已经学习了更多关于如何使用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)
}
我如何正确编码?
答案 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层),有些人更喜欢其他解决方案。如果你仔细观察它,你可能会发现你可以进一步利用向量化和pmax
,max
在每个元素上逐段应用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
为了说明这是如何运作的,我将展开pmin
和hours <- 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
其他人自行解决。