2017-09-28 7 views
-2

私はコンピューターサイエンスの学生の紹介で、Pythonの使い方をもっと学び、Rを学んでいます。私はRに慣れていないので、残業を計算する方法を考え出しました支払うが、私は私の構文が間違っているのかわからないです:Rの中での構文、Overtime Pay

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

は、どのように私はこれを正しくコーディングするのでしょうか?

+3

まず、あなたのためのコードを '{}'の中に置き、 '{}'の後には置かないようにしてください。他のかっこについても考えてみてください。例えば、 'return()'は括弧内の値を返し、 ')'の後のものは考慮しません。 '時間(hours)'が真実(非ゼロ)か偽(0)かどうかを 'if(hours)'がテストします。 – Gregor

答えて

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))の違いに注意してください。)

このような何か試してみてください:

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 

残りは自分自身をソートします。私はpmaxpminコンポーネントが展開するだろう、これがどのように機能するかを示すために

computePay2 <- function(pay, hours, overtime_hours = 40, overtime_factor = 1.5) { 
    pmax(0, hours - overtime_hours) * overtime_factor * pay + 
    pmin(hours, overtime_hours) * pay 
} 

を。

+0

ありがとうございます!それは有り難いです! –

2

"newpay * total"の式はreturnコマンドの範囲外です。あなたはかっこ内に置く必要があります。 2行目の先頭にある最後の括弧は、最後の行に移動する必要があります。また、 "(hours)> = 40"ではなく "(hours> = 40)"を指定する必要があります。文体的には、変数名はあまり選択されておらず、字下げもありません(これは、間違った括弧に気付くのに役立ちました)。また、計算を簡略化することができます。

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

あなたは1時間ごとに1時間ごとの賃金を得ます。 40時間以上毎時間、毎時賃金に時間賃金の半分を加えた額を得る。したがって、総賃金は賃金*(合計時間+(40時間以上)/ 2)です。 40を超える時間は合計時間から40を引いたもの、またはゼロのいずれか大きい方になります。

+0

ありがとう!私はまずクラスでPythonを学び始めましたが、まだR構文に慣れています。 –