« 2014年9月 | トップページ | 2014年11月 »

2014年10月24日 (金)

[R]OSの環境変数を得る、設定する

Sys.getenv関数とSys.setenv関数を使用する。以下はWindowsのRで実行した例。なお、Sys.getenv関数は存在しない環境変数を指定すると、長さが0の文字列を返す。

> Sys.getenv("OS")
[1] "Windows_NT"
> Sys.getenv("windir")
[1] "C:\\WINDOWS"
> Sys.getenv("wwindir")
[1] ""
> Sys.getenv("abc")
[1] ""
> Sys.setenv(abc = "123")
> Sys.getenv("abc")
[1] "123"

2014年10月18日 (土)

[R]ディレクトリ内のファイルを取得する

list.filesコマンドを使用する。dirコマンドも全く同じコマンド。

第1引数に取得したいディレクトリを指定する。特にオプションを指定しないとすべてのファイルとフォルダーが文字型ベクトルで返される。

patternオプションに正規表現で指定をすることで、抽出するファイル名を指定することができる。なお、当然だが大文字小文字は標準の状態では区別されてしまうので、大文字小文字を無視したいのであればignore.caseオプションをTRUEにすること。

第1引数に存在しないディレクトリを指定したり、合致するファイル名がない場合は、空の文字型ベクトルが返される。

> list.files("C:\\windows")
  [1] (以下表示省略)
> list.files("C:\\windows", pattern = "^sys")
[1] "system.ini"
> list.files("C:\\windows", pattern = "^Sys")
[1] "System"          "System32"        "SystemResources" "SysWOW64"      
> list.files("C:\\windows", pattern = "^Sys", ignore.case = TRUE)
[1] "System"          "system.ini"      "System32"        "SystemResources" "SysWOW64" 
> list.files("C:\\windows", pattern = "abc$")
character(0)
> list.files("C:\\winwin")
character(0)
> dir("C:\\winwin")
character(0)

2014年10月17日 (金)

[R]JPEG形式の画像ファイルのサイズ(縦横のピクセル幅)を得る

パッケージjpegをインストールしてラスターイメージオブジェクトにすれば簡単に取得できる。

ラスターイメージは単純な配列であり、その配列の要素数を調べれば縦横のピクセル幅を得ることができる。

以下のような幅128ピクセル、高さ64ピクセルの画像を例として扱う。

Image_4

まず、パッケージjpegをインストールして使える状態にする。

> install.packages("jpeg")
Installing package into ・・・
(表示省略)
> library(jpeg)

readJPEG関数でラスターイメージにすると、dim関数を使うと画像ファイルの縦横のピクセル幅を得ることができる。dim関数でラスターイメージを指定したときにベクトルが返される。1つ目が縦方向のピクセル幅。2つ目が横方向のピクセル幅。

> image <- readJPEG("image.jpg")
> mode(image)  # モードは数値
[1] "numeric"
> class(image)  # クラスは配列
[1] "array"
> dim(image)  # 次元を得る
[1]  64 128   3
> dim(image)[1]  # 画像ファイルの縦方向のピクセル幅
[1] 64
> dim(image)[2]  # 画像ファイルの横方向のピクセル幅
[1] 128

2014年10月16日 (木)

[R]PNG形式の画像ファイルを図の任意の位置に貼り付ける

PNG形式の画像ファイルを図の任意の位置に貼り付ける。

pngパッケージを使えば、Rの標準搭載のグラフィックス(graphicsパッケージ)を使用して図に画像を貼り付けることができる。

pngパッケージをインストールして使える状態にする。このパッケージに含まれるreadPNG関数を使用して画像ファイルを読み込み、rasterImage関数で画像を貼り付ければよい。

なお、ここで重要なrasterImage関数の引数は以下のとおり。

rasterImage(image, xleft, ybottom, xright, ytop)

  • image - ラスターオブジェクト
  • xleft - 画像を貼り付ける際の左端の座標
  • ybottom - 〃〃の下端の座標
  • xright - 〃〃の右端の座標
  • ytop - 〃〃の上端の座標

以下は実際に貼り付け例。以下は貼り付け例で使用したPNG画像image.png。大きさは幅128、高さ64ピクセル。

Image_3

まずはパッケージpngをインストールする。

> install.packages("png")
Installing package into ・・・
(表示省略)

パッケージpngを使える状態にして、実際に図に貼り付けてみる。

> library(png)
> plot(0, 0, type = "n", xlim = c(0, 10), ylim = c(0, 10))
> image <- readPNG("image.png")
> rasterImage(image, 0, 0, 8, 2)
> rasterImage(image, 2, 4, 4, 10)
> rasterImage(image, 6, 1, 10, 8)
> rasterImage(image, 6, 9, 11, 12)

結果は以下のとおり。

Result_png_2

図を見てのとおり、重なる場合はあとから貼り付けられた画像が上書きされる。図の描画範囲からはみ出てたものは描画されない。右上はわかりにくいが、図枠も上書きされてしまっていることに注意。

2014年10月14日 (火)

[R]データフレームの列名を変更する

例えばread.table関数でファイルからデータを読み込んでデータフレームを自動作成すると、その列名はV1、V2、V3、・・・、と連番で自動的に列名が付けられる。これを後から変更するにはnames関数を使う。

以下は、ファイルからread.table関数でデータを読み込んで桁が2桁のデータフレームを自動作成し、そのデータフレームの左側の列をx、右側の列をyという名前にしたときの例。

> dtf <- read.table("data.dat")
> names(dtf) <- c("x", "y")

Rによるやさしい統計学 Rによるデータサイエンス - データ解析の基礎から最新手法まで Rによる統計解析 フリーソフト「R」ではじめる 統計処理超入門 (知識ゼロでもわかる統計学) RとRubyによるデータ解析入門 Rによる統計解析ハンドブック The R Tips―データ解析環境Rの基本技・グラフィックス活用集 「R」ではじめる統計 (I・O BOOKS) Rによる時系列分析入門

2014年10月12日 (日)

[R]ファイルをコピーする

file.copy関数を使えばよい。なお、オプションを付けないと、コピー先のファイルがある場合はコピーされない。コピーしたファイルのタイムスタンプもコピーした日時になってしまうので注意。

> v <- dir(pattern = "\\.txt$")  # フォルダーにある拡張子が.txtのファイルを得る
> v
[1] "a.txt"                                          
[2] "b.txt"                                          
> file.copy(v[1], v[2])  # a.txtをb.txtにコピーするが上書きできずに失敗
[1] FALSE
> file.copy(v[1], v[2], overwrite = TRUE)  # 上書きできて成功
[1] TRUE
> file.info(v[1])$mtime  # ファイルa.txtの日付を確認
[1] "2014-10-10 21:03:03 JST"
> Sys.time(); file.copy(v[1], v[2], overwrite = TRUE); file.info(v[2])$mtime
[1] "2014-10-10 21:13:37 JST"
[1] TRUE
[1] "2014-10-10 21:13:37 JST"
> file.copy(v[1], v[2], overwrite = TRUE, copy.date = TRUE)
[1] TRUE
> file.info(v[2])$mtime  # ファイルの日付はa.txtと同じ
[1] "2014-10-10 21:03:03 JST"

2014年10月11日 (土)

[R]データフレームから指定の行(桁)を取り出してデータフレームを作成する

[ ]演算子を使えばよい。ベクトルで値を与える。

> v1 <- c(10, 20, 30)
> v2 <- c("AB", "CDE", "EFGH")
> v3 <- c(3, 9, 81)
> dtf <- data.frame(v1, v2, v3)  # データフレームを作成
> dtf
  v1   v2 v3
1 10   AB  3
2 20  CDE  9
3 30 EFGH 81
> dtf[c(2, 3), ]  # 2行目と3行目からなるデータフレームを作成
  v1   v2 v3
2 20  CDE  9
3 30 EFGH 81
> dtf[, c(1, 3)]  # 1列目と3列目からなるデータフレームを作成
  v1 v3
1 10  3
2 20  9
3 30 81
> dtf[, c("v1", "v3")]  # 列の指定は文字列で列名で与えてもよい
  v1 v3
1 10  3
2 20  9
3 30 81

2014年10月10日 (金)

[R]文字列ベクトルから、指定したパターンに合致するものを取り出す

grep関数を使えばよい。なお、正規表現が使える。

オプションを何も付けないとパターンに合致したインデックスを返す。合致する値そのものを取り出したいときはvalueオプションにTRUEを与える。

合致するものがない場合は、長さが0のベクトルを返す。

> st <- c("ABCD", "ABCD1", "ABCD2")
> grep("[0-9]$", st)  # 文字列が数字で終わるもののインデックスを取り出す
[1] 2 3
> grep("[0-9]$", st, value = TRUE)  # 文字列が数字で終わるものの値そのものを取り出す
[1] "ABCD1" "ABCD2"
> n <- grep("^[0-9]", st)  # 一致するものがないときは長さが0のベクトルを返す
> class(n)
[1] "integer"
> length(n)
[1] 0
> st2 <- grep("^[0-9]", st, value = TRUE)  # 上と同じ
> class(st2)
[1] "character"
> length(st2)
[1] 0

2014年10月 9日 (木)

[R]Rの起動後にインターネットへの接続方法を変える

Rはdownload.file関数などのインターネットへの接続は、普通に起動した場合は、直接接続しようとする。ただし、会社などのプロキシサーバーが設定されている環境では直接接続が禁じられている場合がある。このような場合のため、Rを起動するときに--internet2オプションを付けると、Internet Explorerの設定に従ってインターネット接続する。

ただし、.RDataファイルのダブルクリックによりRを起動した場合は--internet2を付けて起動をすることが難しい。

Rを起動した後に、--internet2オプションが有効になっているか否かは、setInternet2関数にNAを与えればよい。有効の場合(インターネットへの接続にInternet Explorerの設定を使用)はTRUE、そうでない場合はFALSEが返される。

--internet2オプションを付けないでRを起動したとき。

> setInternet2(NA)
[1] FALSE

--internet2オプションを付けてRを起動したとき。

> setInternet2(NA)
[1] TRUE

なお、Rを起動後に--internet2オプションを有効にするには、setInternet2関数を引数無しで接続すればよい。

> setInternet2(NA)
[1] FALSE
> setInternet2()
> setInternet2(NA)
[1] TRUE

2014年10月 8日 (水)

[R]コマンドプロンプトやPowerShellのコマンドをスクリプト内で実行する

shell関数を使用すればよい。なお、オプションを何も指定しないと、シェル上でコマンドを実行したときと同じ画面表示が行われる。internオプションをTRUEにすると、画面表示が文字ベクトルとして戻り値で与えられるので、以下の例のように代入先を指定しておくと、画面表示は何も行われない。

> st <- "dir C:\\windows\\*.ini"
> shell(st)
ドライブ C のボリューム ラベルは ○○ です
ボリューム シリアル番号は ○-○ です
(以下表示省略)
> v <- shell(st, intern = TRUE)
> head(v)
[1] " ドライブ C のボリューム ラベルは ○○ です"     " ボリューム シリアル番号は  ○-○ です"
(以下表示省略)

なお、注意点として、第1引数に与えた文字列がそのままOSに渡されることから、Rの動作環境がWindowsの場合はフォルダーの区切り文字には「/」(スラッシュ)は使えないので注意。その場合、「\」(円マーク)が特殊な記号であることから上記例のように「\\」と重ねて指定する必要がある。

2014年10月 7日 (火)

[R]ベクトルの要素を並び替える、並び替えた場合のインデックスの並びを得る

ベクトルの要素を並び替えるには、sort関数を使えばよい。

ベクトルの要素を並び替えた場合のインデックスの並びを得るには、sort.list関数を使えばよい。以下、例。

> i <- c(1, 4, 3, 2)
> sort(i)
[1] 1 2 3 4
> sort.list(i)
[1] 1 4 3 2
> st <- c("0", "1", "2", "01", "A", "B", "AB")
> sort(st)
[1] "0"  "01" "1"  "2"  "A"  "AB" "B"
> sort.list(st)
[1] 1 4 2 3 5 7 6

2014年10月 6日 (月)

[Fortran]固定形式と自由形式

Fortranのソースプログラムの書き方は2種類ある。固定形式と自由形式。

固定形式はFORTRAN77までの書き方。左端に6個以上のスペースをとり、7~72桁にプログラムを書く書き方。

自由形式はFortran90から採用された書き方。左端に6個以上のスペースは不要で、1桁目からプログラムを書くことができる書き方。

gfortranでは、コンパイラに渡したソースファイルの拡張子で、そのソースファイルが固定形式が自由形式かを判断してコンパイルをする。

○固定形式
.f .for .fpp .ftn .F .FOR .FPP .FTN

○自由形式
.f90 .f95 .f03 .f08 .F90 .F95 .F03 .F08

2014年10月 5日 (日)

[Fortran]起動をするプログラム自身のファイル名(プログラム名)を得る

サブルーチンget_command_argumentを使えばよい。第1引数に整数の0を与えると、その起動しているプログラム自身のファイル名(プログラム名)が得られる。

program prgname
    implicit none
    character(len = 48) :: str
    call get_command_argument(0, str)
    print *, str
end program prgname

以下はWindows PowerShellにおける実行例。「C:\○○\○○」はそのプログラムを実行したフォルダーを示す。

PS C:\○○\○○> .\prgname.exe
C:\○○\○○\prgname.exe

このサブルーチンはFortran2003で採用された機能であり、2003もしくは2003以降のFortranで使うことができる。現在のgfortranでは採用された機能のため問題なく使用することができる。

2014年10月 3日 (金)

[Fortran]プログラム起動時に与えられた引数(コマンドライン引数)を得る

サブルーチンget_command_argumentを使えばよい。このサブルーチンを使うことで文字変数に代入することができる。

なお、command_argument_countが組み込み関数である一方で、こちらはサブルーチンであることに注意。

以下のプログラムは、プログラム起動時に与えられた引数を順番に表示するプログラム。do文で引数の数だけ繰り返し出力していることから、引数の数を得る関数command_argument_countを最初に使用している。

program argget
    implicit none
    integer :: i, len
    character(len = 16) :: str
    len = command_argument_count()
    if (len > 0) then
        do i = 1, len
            call get_command_argument(i, str)
            print *, str
        end do
    end if
end program argget

以下はWindows PowerShellにおける実行例。

PS > .\argget.exe
PS > .\argget.exe 1
1
PS > .\argget.exe 1 A
1
A
PS > .\argget.exe 1 A BC
1
A
BC

このサブルーチンはFortran2003で採用された機能であり、2003もしくは2003以降のFortranで使うことができる。現在のgfortranでは採用された機能のため問題なく使用することができる。

2014年10月 2日 (木)

[Fortran]プログラム起動時に与えられた引数(コマンドライン引数)の数を得る

組み込み関数command_argument_countを使えばよい。

program argcount
    implicit none
    integer :: n
    n = command_argument_count()
    print *, n
end program argcount

以下はWindows PowerShellにおける実行例。

PS > .\argcount.exe
           0
PS > .\argcount.exe 1
           1
PS > .\argcount.exe 1 a BC
           3

この関数はFortran2003で採用された機能であり、2003もしくは2003以降のFortranで使うことができる。なお、現在のgfortranでは既に採用された機能のため問題なく使用することができる。

« 2014年9月 | トップページ | 2014年11月 »

無料ブログはココログ

■■

■■■