使い方
1.スクリプト窓
1.1.スクリプト編集窓の表示
「コンソール窓」で、コマンド入力した履歴や作成したオブジェクトはワークスペースとして保存されます。ここでは、実行したコマンドをスクリプトとして、テキストで保存する場合の使い方を示します。
「ファイル」「新しいスクリプト」を選ぶと、「スクリプト編集窓」が表示されます。
「スクリプト編集窓」の内容は、任意の名前のテキストファイルに保存できます。
メニューは、どの窓がアクティブかで変わります。「スクリプト編集窓」が選択された状態で、保存操作をしてください。
次回からは、「ファイル」「スクリプトを開く」で、開くことができます。
1.2.スクリプトの実行
「スクリプト編集窓」の右ボタンメニューで、「カーソル行または選択中のRコード実行」で実行します。
※気が付いたこと
plot()などで描画した日本語が化けます。「カーソル行または選択中のRコード実行」のとき、選択せず1行のみを実行すると化けることに気が付きました。一行でも、選択状態にしてから実行すれば化けません。
複数行を選択して実行できないことがあります。コンソール画面では、空行が入力されたような表示になります。VNCクライアントを起動していると確実にこの状態になります。
2.データをファイルから読み込む
2.1.scan()
data <- scan("text.txt")のようにファイル名を指定して入力します。「マイ ドキュメント」がデフォルトのパスのようです。Visual Studioのデバッグウインドウから、数値をコピーして、テキストファイルを作ってデバッグに使いました。
2列のデータを入力したところ、2列の配列にはならず、左右、左右,...となりました。
d<-scan("tmp.txt",list(a=0,b=1))
と、すると、d[1],d[2]に各列が格納されました。
ここで、
plot(d[1])
は、エラーになりました。x<-d[1]として、xをプロットするのもできません。これはlistだからなのだと思います。
x<-d$a
の、ようにすると、普通の配列として使えます。
d2 <- scan("tmp.txt")
d <- matrix(d,2,byrow=T)
または、
<- matrix(scan("tmp.txt"),2,byrow=T)
も、使える。
byrow=Tの効果:
> matrix(1:9, nrow=3, ncol=3, byrow=T)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> matrix(1:9, nrow=3, ncol=3)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>
3. 作業ディレクトリの設定
Rの起動に使用しているメニューやアイコンのプロパティを開いて、「ショートカット」タブの「作業ディレクトリ」を変えることができます。
あるいは、
> getwd()
[1] "C:/Documents and Settings/XXX/My Documents"
setwd("/XXX/R_WORK")
> getwd()
[1] "C:/XXX/R_WORK"
C:/Program filese/R/R-2.7.2/etc/Rprofile.site
に、setwd()を記述しておくと、最初から任意のディレクトリで作業できます。
作業ディレクトリに
.Rprofile
が、あると、このスクリプトも実行されます。
4.複数の作図ウインドウ
Graphicsウインドウのタイトルバーには、「Device 1 (ACTIVE)」のような表示がある。
ウインドウの作成
windows()
と、すると新しい窓ができる。Deviceの番号はインクリメントされる。
windows(width=4,height=3)
あるいは、
windows(4,3)
の、ようにサイズが指定できる。デフォルトは7で、inchらしい。
ウインドウの切り替え
dev.set(2)
のように、デバイス番号を指定する。
5.plot()の図を重ねるには
plot()とplot()の間で、par(new=T)とする。
plot(Re(f3[2:length(f3)]),type="l",col=3,axes=F,xlab="",ylab="")
のように指定すると、軸や軸のラベル描画を消すことができる。
6.関数定義などのスクリプトをファイルから読み込む
source("func.txt")
7.代入
代入は、
<-
を使いますが、
plot(s,type="l",ylim=c(-1,1),col=3)
のように、等号(=)が使われている箇所も見かけます。
等号(=)は、既定のパラメータの値の変更にのみ使うと言うルールのようです。
8.数列を作る
刻みを指定して
ns <- seq(初期値、by=増分,length.out=個数)
開始値、終わり値を指定して
ns <-seq(ftom=開始値,to=終わり値,by=増分)
あるいは、
ns <- seq(開始値,終わり値,増分)
9.左、上の軸の描画
par(mar = c(下, 左, 上, 右))で、マージンを調整する
c(5, 4, 4, 2) + 0.1 がデフォルト。
plot()後に、axis()で軸を書く。plot()では、axes=Fとして軸を書かない。plot()したデータのレンジからaxis()は目盛を決めている。
axis()は、線と目盛の数字を司る。名前は、mtext()で書く。axis()でのcolは線の色。col.axisは目盛の文字の色になる。
axis()、mtext()でのsideは、下, 左, 上, 右。
mtext(),title()で指定するlineは、軸からの行数。大きいと軸から離れる。
par(mar = c(4, 4, 5, 4)) # 右の軸のためにマージンを広く
x1 <- seq(from=0,to=32767,by=1000)
x2 <- seq(from=0,to=1,by=1/(length(v1)-1))
plot(x1, log(x1),type="l",col=1,
axes=F,xlab="非正規化振幅",ylab="非正規化振幅の対数")
axis(1) # X軸(上)
axis(2) # Y軸(左)
par(new=T) # 重ねがきをする
plot(x2,log(x2),type="p",col=2,axes=F,xlab="",ylab="")
axis(3,col=2,col.axis=2) # X軸(上) 色を赤に。col.axisは文字の色
axis(4,col=2,col.axis=2) # Y軸(右) 色を赤に。colは、線の色
mtext("正規化振幅",3,line=2,col=2) # X軸(上)のタイトル
mtext("正規化振幅の対数",4,line=2,col=2) # Y軸(右)のタイトル
title(main="入力の正規化とその対数",line=3)
10.小数点以下の桁数を制限
round(range(Im(fft(f0,inv=T))),5) # 虚部のレンジを確認
11.レンジを計算
単にrengae()は、minとmaxの2つを表示する。
diff(range(abs1))
12.プロットのマークを変える
pch=1のように指定して、既定のマークを選ぶか、文字を指定する。
plot(complex(re=d,im=0)*ep,pch=c("1","2","3","4","5","6","7"))
13.1行に複数ステートメント
; (セミコロン)で区切って、1行に複数ステートメント書ける。
14.コメント・ブロック
複数行をコメントににする方法は特にないらしい。
if(0){}
で、代替。
15.組み込み定数
help(pi)とすると、「Built-in Constants」として、5つが表示される。一般に再定義はエラーにならないので、変数名、関数名は重ならないように注意する。
LETTERS
letters
month.abb
month.name
pi
16.変数名、関数名
一般に再定義はエラーにならないので、変数名、関数名は重ならないように注意する。
大文字、小文字は区別される。
17.ベクトル、行列、配列、リスト、クラス、データフレーム
ベクトルは、1:10やc(1,3,5)、seq(1,10)で作ります。
それ以外は、それぞれmatrix()、array()、list()で作ります。
ベクトル、マトリクス、アレイは、配列で、ベクトルは1次元、マトリクスは2次元です。
リストは、これらの組を作ることだと思います。
ベクトルは、具体的には出てこないように思っていましたが、as.vector(配列)で、配列を一次元に変換するときにvectorの語が使われます。
クラス、データフレームはまだ使っていない。
18.オブジェクトを調べる
str()
class()
dim()
typeof()
mode()
19.コロン(:)
数列を作る。常に増分の絶対値は1のよう。1変化して、範囲外なら打ち切り。
> 0.5:4.5
[1] 0.5 1.5 2.5 3.5 4.5
> 4.5:0.5
[1] 4.5 3.5 2.5 1.5 0.5
> 1:4.5
[1] 1 2 3 4
演算子として優先度が高い。
1:2*5は、
(1:2)*5で、5,10になる。
> 1:8 - (8+1)/2
[1] -3.5 -2.5 -1.5 -0.5 0.5 1.5 2.5 3.5
>
20.スクリプトの実行について
スクリプト窓でreadline()を記述して、「カーソル...実行」をすると文字化けします。また、複数行を実行すると、続く文字列を入力と見なすため、入力待ちにはなりません。readline()は、こう言う使い方をするものではないようです。
このことから、スクリプトが実行される状態にはいくつか種類があると言うことなのだと思います。
また、このことはRスクリプトで、ひとまとまりのプログラムをどう作るかと言うことでもあります。
コンソールにスクリプトを入力
この場合は、readline()にはあまり使い道がなさそうです。文字化けが無い(プロンプトを指定しないか英字にする)として、変数に値を代入することができますが、直接代入文を書く方が良いように思います。
source()による実行
source()は、スクリプトの実行をします。source()は関数定義する方法の説明にでてきますが、スクリプトの実行するので、結果として、保存してある関数定義の読み込みに使えると言うことなのだと思います。
スクリプトファイル中のreadline()は、source()で実行した場合には、期待した動作をします。
また、.Rprofileにsource()を記述しておくとRguiの起動時に実行されます。.Rprofileは、「ファイル」「スクリプトを開く」で表示されるディレクトリに置きます。
mainプログラムも関数定義
関数などのオブジェクトとしてスクリプトを書いてオブジェクトを評価して実行できると思いますが試していません。
attach()について
関数定義を読み込む方法では、source()とattach()がでてきますが、attach()は、まだ試していないのですが、作業スペースを切り替えるものではないかと思います。Rguiの終了時に「作業スペースを保存しますか?」と聞かれますが、.Rdata以外のファイルを指定できると言うことだと思います。プログラムを作業スペースとして考えることができるのかもしれませんが、バージョンに対する依存が気になります。
21.プロットのたびにポーズ
par(ask=T)
とすると、以降のプロットのたびに、「ページ変更を確認するまで待機中... 」と表示され停止する。グラフ上をクリックすするなどすると先へ進む。
22.リストの要素
「アイウエオ」を「アカサタナ」に使用として、まず文字列を文字に分割して見ました。13要素からなるリスト e ができました。
> d <- c(" ア イ ウ エ オ",
" カ キ ク ケ コ",
:
" パ ピ プ ペ ポ")
> e <- strsplit(d," ")
> str(e)
List of 13
$ : chr [1:6] "" "ア" "イ" "ウ" ...
$ : chr [1:6] "" "カ" "キ" "ク" ...
:
$ : chr [1:6] "" "パ" "ピ" "プ" ...
>
e[2]はリストで、e[[2]]はベクトルになります。
unlist()も同じ効果かがあります。
> str(e[2])
List of 1
$ : chr [1:6] "" " カ " " キ " " ク " ...
> str(e[[2]])
chr [1:6] "" " カ " " キ " " ク " " ケ " " コ "
> str(unlist(e[2]))
chr [1:6] "" " カ " " キ " " ク " " ケ " " コ "
>
23.文字列の操作
cat()は、print()の仲間で、文字連結関数ではない
paste()が文字連結関数
その他に以下のものが使える
strsplit()
substring()
character()
unlist()
nchars()
> s <- cat("123","abc","456","
",sep="")
123abc456
> s
NULL
> s <- paste("123","abc","456","
",sep="")
> s
[1] "123abc456
"
> nchar(s)
[1] 10
> substring(s,2,4)
[1] "23a"
> paste(1:5)
[1] "1" "2" "3" "4" "5"
> paste(paste("A",1:5,sep="_"))
[1] "A_1" "A_2" "A_3" "A_4" "A_5"
> s <- paste(paste("A",1:5,sep="_"),collapse="")
> s
[1] "A_1A_2A_3A_4A_5"
> s <- strsplit(s,"_")
> s
[[1]]
[1] "A" "1A" "2A" "3A" "4A" "5"
> s[1]
[[1]]
[1] "A" "1A" "2A" "3A" "4A" "5"
> s[[1]]
[1] "A" "1A" "2A" "3A" "4A" "5"
> s[1][1]
[[1]]
[1] "A" "1A" "2A" "3A" "4A" "5"
> s[[1]][1]
[1] "A"
> unlist(s)
[1] "A" "1A" "2A" "3A" "4A" "5"
>
24.表形式でのデータ操作
data.entry(x)
25.ソート
order()で、大小順を格納した配列を作ってインデクスに使うことで並べ替える。
decreasing で、ソート順(アセンディング(FALSE)、ディセンディング(TRUE))を指定。
> neko<-c("三毛","黒","二毛")
> colors<-c(3,1,2)
> neko[order(colors)]
[1] "黒" "二毛" "三毛"
>
26.色指定
> palette()
[1] "black" "red" "green3" "blue" "cyan" "magenta" "yellow"
[8] "gray"
> palette(c("red","cyan","blue"))
> palette()
[1] "red" "cyan" "blue"
> palette("default")
> palette()
[1] "black" "red" "green3" "blue" "cyan" "magenta" "yellow"
[8] "gray"
>
plotでcol=1とするとパレットの[1]の色が使われる。
名前のある色の列挙は、
> colors()
[1] "white" "aliceblue" "antiquewhite"
[4] "antiquewhite1" "antiquewhite2" "antiquewhite3"
:
[655] "yellow3" "yellow4" "yellowgreen"
>
色を作る関数はrgb(),hsv(),hcl(),gray(),rainbow(),heat.colors(),topo.colors(),terrain.colors()がある。
いずれも、#と8桁の16進数の文字列を返し、RRGGBBAAを表す。(色名からはcol2rgb()で変換)
> r<-rgb(1,0,0,1)
> g<-rgb(0,1,0,1)
> b<-rgb(0,0,1,1)
> r
[1] "#FF0000FF"
> g
[1] "#00FF00FF"
> b
[1] "#0000FFFF"
>
(R,G,Bの範囲は、maxColorValue で決まり、デフォルトは1。)
#と6桁の16進数の文字列も可のようで、この場合はRRGGBB。
rainbow(),heat.colors(),topo.colors(),terrain.colors()は、最低1つの整数を引数にとり、生成する色の数を指定する。
簡単な色見本:
r<-g<-b<-seq(0,1,length.out=16)
n<-1
rc=1
cc=1
z<-matrix(nrow=64,ncol=64)
c<-NULL
for(i in 1:16) for(j in 1:16) for(k in 1:16){
z[rc,cc]<-n
cc=cc+1
if(cc>64) {cc=1; rc=rc+1}
c[n]<-rgb(r[i],g[j],b[k],1);
n=n+1
}
x<-1:64
y<-1:64
par(ask=T)
image(x,y,z,col=c)
image(x,y,z,col=colors(n))
image(x,y,z,col=heat.colors())
image(x,y,z,col=topo.colors(n))
image(x,y,z,col=terrain.colors(n))
image(x,y,z,col=rainbow(n))
27.HSVカラー
hsv(h = 1, s = 1, v = 1, gamma = 1, alpha)
h 0-1 色相(Hue)
s 0-1 彩度(Saturation,Chroma)、
v 0-1 明度(Brightness,Lightness,Value)
gamma
alpha 0-1
Net ColorクラスにあるHSBと同じもののよう。(hが度で表される点を除く)
z<-matrix(c(1,2,3),nrow=3,ncol=1)
image(1:3,1,z,col=c(hsv(0.72,0.4,0.7),hsv(0.5,0.5,0.7),hsv(0.22,0.5,0.7)))
28.CIELUVカラー
hcl(h = 0, c = 35, l = 85, alpha, fixup = TRUE)
h 0-360
c
l 0-100
alpha 0-1
fixup
z<-matrix(c(1,2,3),nrow=3,ncol=1)
image(1:3,1,z,col=c(hcl(0,60,30),hcl(120,80,50),hcl(240,100,60)))
29.rainbow()の色
4つ以上の色を使う場合、rainbow(n)が便利。n は、必要な色数。
左図の全域の色から均等に色を作ってくれる。
# rainbow()の色見本
n <- 8
image(0:n,0:0,matrix(1:n,ncol=1),col=rainbow(n),
main=paste("rainbow(",as.integer(n),")"),
axes=F,xlab="",ylab="")
30.次元数を変える
画像を扱うとき、[x,y]の配列から1次元([x,y]を水平(X方向)にスキャンした状態)にする必要がありました。
まず、1次元から2次元に。
> matrix(1:9,ncol=3,byrow=T)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
> matrix(1:9,ncol=3)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> array(1:9,c(3,3))
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>
1次元から多次元に。
> array(1:12,c(3,2,2))
, , 1
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
, , 2
[,1] [,2]
[1,] 7 10
[2,] 8 11
[3,] 9 12
多次元を1次元に。
> m <- matrix(1:12,ncol=3)
> m
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
> as.vector(m)
[1] 1 2 3 4 5 6 7 8 9 10 11 12
>
次数を書き換える
> dim(m)
[1] 4 3
> dim(m) <- c(3,4)
> dim(m)
[1] 3 4
> m
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
>
失敗
1.行を分けて、式をかくときは括弧が必須のようです。下記、いずれも、エラーになりませんが、結果が異なります。
正
誤
fx <- matrix(0,48)
t <- 0
for(i in 1:48){
fx[i] <- ( 0.46*cos( 9*t)-0.10*sin( 9*t)
+0.32*cos(10*t)-0.06*sin(10*t)
-0.30*cos(11*t)+0.06*sin(11*t)
-0.36*cos(12*t)+0.08*sin(12*t))
t <- t + 2*pi/48
}
plot(fx,type="l")
fx <- matrix(0,48)
t <- 0
for(i in 1:48){
fx[i] <- 0.46*cos( 9*t)-0.10*sin( 9*t)
+0.32*cos(10*t)-0.06*sin(10*t)
-0.30*cos(11*t)+0.06*sin(11*t)
-0.36*cos(12*t)+0.08*sin(12*t)
t <- t + 2*pi/48
}
plot(fx,type="l")
2.seq()で、良くby=を忘れます。これもエラーになりませんが、結果が異なります。
正
誤
seq(0,by= 3*pi/7,length.out=16)
seq(0,3*pi/7,length.out=16)
3.for()の繰り返しの指定の式
配列の長さの半分まで繰り返そうと、
for(i in 1:length(a)/2)
書いても、繰り返し数は半分にならず、iの値が半分になる。
> a<-c(1,2,3,4)
> for(i in 1:length(a)) print(i)
[1] 1
[1] 2
[1] 3
[1] 4
> for(i in 1:length(a)/2) print(i)
[1] 0.5
[1] 1
[1] 1.5
[1] 2
> for(i in 1:(length(a)/2)) print(i)
[1] 1
[1] 2
4.配列の部分
「for()の繰り返しの指定」と同様だが、
a[1:2*5]とa[1:10]は異なる。
1:2*5は、
(1:2)*5で、5,10になる。
Amazon.co.jp ウィジェット