プログラミング演習tohhiro/prog18/...複数の条件を組み合わせる 条件1 &...
TRANSCRIPT
プログラミング演習第四回
・ 条件分岐
本日の講義内容
http://sci-tech.ksc.kwansei.ac.jp/~tohhiro/link.htmlよりダウンロード
1.条件分岐とは?
if (条件) {条件が真(TRUE)の時の処理
}else {条件が偽(FALSE)の時の処理
}
条件分岐
条件の書き方x == y 一致x < y xがyより小x <= y xがy以下x > y xがyより大x >= y xがy以上x != y xはyと異なる
== と != は数値だけでなく、文字列についても使える
x <- 2 if (x > 0) {
sum(1:x) ß- 条件が真(TRUE)の時に実行される} else {
x <- -x ß-条件が偽(FALSE)の時に実行されるsum(1:x)
}
処理が1行の時は、{}で囲まなくても良いx <- -3 if (x > 0) sum(1:x) else {
x <- -x sum(1:x)
}
x <- 2if (x > 0) {
sum(1:x)}else {
x <- -xsum(1:x)
}
エラー:予想外の ‘else’です in“else”
エラー:予想外の '}'です in"}"
2つのエラーが出力される
前ページのコードと比較し、どこが違うか考えなさい
x <- -3 if (x > 0) sum(1:x) else {
x <- -x sum(1:x)
}
エラー:予想外の 'else'です in"else”エラー:予想外の '}'です in"}”
前前ページのコードと比較し、どこが違うか考えなさい
forループや今回学ぶ条件分岐など、複数行にわたるスクリプトを書く場合、メモ帳やこれから説明するRのエディタに一旦書いて、それをRのコンソールにコピペすると良い。
間違っていても修正が簡単
ここに書き込む
コピーして
ペーストしてエンターをおす
2.for文 (繰り返し処理)の中で条件分岐を使ってみる
x <- c(120,10,34,909,21,3,67,221,87,112)len <- length(x)for ( i in 1:len) {
if (x[i] > 100) {print(i)
} else {print("****")
}}
[1] 1[1] "****"[1] "****"[1] 4[1] "****"[1] "****"[1] "****"[1] 8[1] "****"[1] 10>
ベクトル xの要素が100より大ならi を出力
さもなければ**** を出力
課題1
x <- c(101, 34, 203, 78, 20, 81, 141)for (i in x ) {
if (iが3の倍数) {print(i) ß- その時のiの値を書き出す
} else if (iを3で割った時の剰余が1) {print文 iから1を引いた値を書き出す
} else {print文 iから2を引いた値を書き出す
}
}
ベクトルxの各要素を、その要素と一致するか、それに最も近い3の倍数をかき出すようにしたい赤字の部分をRの言語で書いて、このプログラムを完成させなさい
[1] 99[1] 33[1] 201[1] 78[1] 18[1] 81[1] 141
ヒント 完成したものの出力は以下のようになる
3.複数の条件を組み合わせた条件分岐
複数の条件を組み合わせる
条件1 & 条件2条件1も条件2の真であれば真その他は、偽
条件1 | 条件2条件1か条件2のいずれかが真であれば真両方が偽の時に偽
2条件だけでなく(条件1 & 条件2) | 条件3 などのように複数の条件を組み合わせて利用できる
&と &&の違い (|と ||の違い)
a <- c(TRUE, TRUE, TRUE, FALSE)b <- c(FALSE, TRUE, FALSE, FALSE)x <- 1y <- 2
‘&’あるいは’|’はベクトルのそれぞれの要素を評価a & bFALSE TRUE FALSE FALSEa | bTRUE TRUE TRUE FALSEc(x==1, y==1) & c(y==2, x==1)TRUE FALSE‘&&’あるいは’||’はベクトルの第一要素のみを評価a && bFALSEa || bTRUEc(x==1, y==1) && c(y==2, x==1)TRUE
a <- 2 b <- -3 if ((a > 0) && (b > 0)) {
c <- a*b } else c <- -a*b c
6が出力される
a <- 2 b <- -3 if ((a < 0) || (b < 0)) {
c <- -a*b } else c <- a*b c
6が出力される
x <- c(120,10,34,909,21,3,67,221,87,112)len <- length(x)
for (i in 1:len) {if ( ) {print(x[i])
}else {
print(i)}
} x[i] は偶数か、x[i]が10以上70以下という条件はどうなるか?
偶数であること => 2で割った余りが0
以上 >=以下 <=
課題2
4.関数の中で条件分岐を使う
myfunc <- function(a) {if (a < 0) print(0) else if (a < 1) print(1) else print(2)
}
引数aが負の数なら0, 0から1までの値なら1それ以外なら2を出力する関数
getEven <- function(filename) {x <- read.table(filename)for (i in 1:length(x[,1])) {
if (i %% 2 == 0) print(matrix(x[i,], ncol=3))}
}
関数はファイル名を引数として与え、そのファイルからの読み出しを関数内で行うことができる
n行3列の行列データが入っているファイルを読ませて、その偶数行だけを出力する関数
このスクリプトをgetEven.Rという名前で保存source(“getEven.R”)でコンソール上から使用できるようになる
実行の仕方getEven(“matrix1.txt”) <- ファイル名を二重引用符で囲むスクリプトやファイルがどのディレクトリにあるかを確認
matrix1.txt2 4 5 9 9 14 7 21 6 23 4 98 3 42 1 15 2 31 3 62 9 1
getEven(“matrix1.txt”) の出力
> getEven("matrix1.txt")[,1] [,2] [,3]
[1,] 9 9 1 [,1] [,2] [,3]
[1,] 1 6 2 [,1] [,2] [,3]
[1,] 8 3 4 [,1] [,2] [,3]
[1,] 5 2 3 [,1] [,2] [,3]
[1,] 2 9 1
sizeCheck <- function(a) {if ( 1 ) {
a <- 2} else {
a <- 3 }
return (a)}
課題3
引数 aはベクトルとする1の空欄 If文は、ベクトルのサイズが5より大きい という条件2の空欄 ベクトルaの後ろに 3を付け加えたベクトルを作って、aに代入する
ヒント c(1,2,3…)としてベクトルを作れるが、c(ベクトル1,数、ベクトル2)などのようにして、ベクトルや数を連結した新たなベクトルを作れる
3の空欄 ベクトルaの第一要素を除いたベクトルを作り、aに代入する講義2回目資料参照
※ 関数がreturnで返せるのは数だけではなk
空白を埋めて次の関数を完成させなさい。引数としてベクトルを与えた時にベクトルのサイズが5より大きければ、そのベクトルの最後に3を加えたベクトルを返す。5以下の場合は、第一要素を除去したベクトルを返す。