ベクトルのようなものを見ないで、あなたの関数の直接の補正のようなものになります。
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))
の違いに注意してください。)
このような何か試してみてください:
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
残りは自分自身をソートします。私はpmax
とpmin
コンポーネントが展開するだろう、これがどのように機能するかを示すために
computePay2 <- function(pay, hours, overtime_hours = 40, overtime_factor = 1.5) {
pmax(0, hours - overtime_hours) * overtime_factor * pay +
pmin(hours, overtime_hours) * pay
}
を。
まず、あなたのためのコードを '{}'の中に置き、 '{}'の後には置かないようにしてください。他のかっこについても考えてみてください。例えば、 'return()'は括弧内の値を返し、 ')'の後のものは考慮しません。 '時間(hours)'が真実(非ゼロ)か偽(0)かどうかを 'if(hours)'がテストします。 – Gregor