R 使い方 debug(デバッグ)方法 スクリプトの書き方

スポンサーリンク

スクリプトが思ったように動かない、そんなときはバグ(プログラムの間違い)があると言われます。スクリプトを書く場合、そのような間違いを書かないように注意することは当然ですが、完全に防ぐのは難しいことです。

スクリプトが思うように動かない場合は、debug作業(デバッグ:バグを取り除く)を行います。スクリプト言語やプログラム言語には、debug(デバッグ)作業をするための仕組みが準備されていることが多いです。Rの debug (デバッグ)機能を活用しましょう。

とにかく早く問題解決したい人はこちら>>直接、データ解析相談

バグ と debug(デバッグ)

debug(デバッグ)とは、プログラムやスクリプトの間違いを発見し、手直しすることです。Rに限らず、プログラム言語やスクリプト言語について、共通して使われる用語です。「バグ」が間違いを指し、「debug(デバッグ)」が手直し作業を指します。

一般的なデバッグ手法

debug(デバッグ)の基本は、データの表示です。変数表示や制御がどのように分岐したかを目印(関数名や処理の分岐点)で表示したりします。パフォーマンスへの影響が小さければ、これらの情報をログファイルなどに残しておくと、バグ発生やそのデバッグの際に役に立つことがあります。どうしても処理は少し重くなるので、パフォーマンスを重視する場合は、デバッグ用のモードを準備するなどして影響を小さくする工夫が必要です。ログのサイズが大きくなると色々と問題が発生するので、リングバッファ形式などを検討したりします。

デバッグの専用機能(デバッガ)を使うと、実行中のプログラムを途中停止して動作を確認するなどの高度なデバッグを行うことができます。デバッガには代表的な機能がありますが、そのようなプログラム環境では、使い方や呼び方もだいたい共通しているようです。

機能説明
ブレークポイントプログラムの任意の位置で実行中に停止します。停止位置における変数確認や、以降の処理をステップ実行につなげます。
ステップ実行プログラム停止位置から、プログラムを1ステップずつ実行し、変数確認や条件分岐の確認などを行います。
変数確認変数の値を確認します。構造化されたデータも展開して確認できる場合が多いです。

Rのデバッグ方法

Rもデバッガ機能(バグブラウザ)を備えています。ブレークポイント・ステップ実行・変数確認を行うことができます。バグブラウザは、Rのスクリプトでbrowser()関数を呼び出したとき起動します。図は、ブレークポイントで停止した状態です。

my_r.r(動作確認用のスクリプト)

#! /usr/bin/Rscript
printf <- function(...) cat(sprintf(...))
x <- 1
browser()
if ( x >= 2 ) {
   printf("x >= %d\n", x)
} else {
   printf("x < %d\n", x)  
}

バグブラウザの操作

バグブラウザは、browser()関数をブレークポイントとして、実行途中で停止した状態を作り出します。以下の操作が、バグブラウザで使う主なコマンドです。

コマンド内容
Qバグブラウザ終了。実行終了。
cバグブラウザ終了。停止位置以降を実行。
nステップ実行。

バグブラウザでのデバッグ

簡単な例(my_r.r)でバグブラウザの動作確認します。

my_r.r(動作確認用のスクリプト)

#! /usr/bin/Rscript
printf <- function(...) cat(sprintf(...))
x <- 1
browser()
if ( x >= 2 ) {
   printf("x >= %d\n", x)
} else {
   printf("x < %d\n", x)  
}

コマンドQ – 実行終了

バグブラウザとスクリプトが実行終了します。例えば、「バグが判明して修正作業にうつる」・「操作ミスで最初からやり直し」など、すぐにデバッグ作業を終了したいときに使います。

$ R # R起動
R> source("my_r.r")
Browse[1]> Q # バグブラウザ起動(Q:実行終了)
>

コマンドc – 停止位置以降を実行

ステップ実行でなく、処理を通常動作させます。例えば、「ブレイクポイントからステップ実行、バグの見当がついて値書き換えなどの仮処置実施、以降の動作を確認したい」場合などに使います。

$ R # R起動
R> source("my_r.r")
Browse[1]> c # バグブラウザ起動(c:停止位置以降の実行)
x < 1 >

コマンドn – ステップ実行

ブレイクポイントから、1ステップずつ実行します。例えば、「値を確認しつつ、分岐がどのように進むか?」を細かくチェックしたい場合などに使います。状況としては、大まかなバグの位置が確認できていて、1つずつ確認しながら追い詰めている状況です。

$ R # R起動
R> source("my_r.r")
Browse[1]> n # バグブラウザ起動(n:ステップ実行)
my_bug.r#8 の debug: printf("x < %d\n", x) Browse[2]> n
x < 1 >

変数書き換え

実行中に値を書き換えることができます。以降のステップにはその値が反映されます。例えば、「今まさにバグの位置が判明し、正しい値へ変更するなどの仮処置を行って、以降の処理が正常動作するか?」と確認する場合などに使います。以降のデバッグの例では、値を変更し、処理の分岐が変わることを確認しています。

$ R # R起動
R> source("my_r.r")
Browse[1]> ls()   # オブジェクトを確認
[1] "printf" "x" 
Browse[1]> x      # 変数xの値を確認
[1] 1
Browse[1]> x <- 2 # 変数xの値の書き換え Browse[1]> n      # ステップ実行
my_bug.r#6 の debug: printf("x >= %d\n", x) # 分岐変化
Browse[2]> c
x >= 2
> 

論文・データ解析の支援

個別に直接相談できるのが良いと、たくさんの方にご利用頂いています。

とにかく早く問題解決したい人はこちら>>直接、データ解析相談
とにかく早く問題解決したい人はこちら>>直接、論文相談

関連記事1

R 4.0 インストール ubuntu
Rのインストール手順について。最近よくつかう「tidyverse」も一緒にインストールします。とにかく早く問題解決したい人はこちら>>直接、データ解析相談R 4.0 インストール手順事前設定$ sudo apt update -qq$ su...
R 使い方 文字列処理(文字列検索・文字列置換)
統計ソフトRは、統計処理やグラフの描画でよく用いられます。しかし、色々なことに活用していると、「文字列処理ができると便利だな」と思うことがあります。統計ソフトRには、文字列処理のための便利な関数が準備されているので、代表的な関数についてまと...
R 使い方 while 繰り返し スクリプトの書き方
Rで「条件を満たす間ずっと繰り返し」を行う場合は、whileを使います。とにかく早く問題解決したい人はこちら>>直接、データ解析相談while スクリプトの書き方while文は、条件式と一緒に書きます。条件を満たす間、一連の文やブロックをず...
R 使い方 for 繰り返し スクリプトの書き方
Rで単純な繰り返し制御を行う場合は、forを使います。とにかく早く問題解決したい人はこちら>>直接、データ解析相談for スクリプトの書き方forは繰り返し制御の基本的な構造です。集合には、ベクターやデータフレームなどを使うことができます。...
R switch 使い方 スクリプトの書き方
R の switch文は、「複数の条件」とそれに「対応した処理」をまとめて記述できるので、if文よりも簡潔にかけます。R の switchの条件は、文字列で書かれたラベルで判断します。R の switch文の「書き方」と使い方を、サンプルを...
R 使い方 if 条件分岐 スクリプトの書き方
R の if文は、フロー制御で最も単純な条件分岐です。条件に「一致したかどうか」という判断で、次に実行するコマンドを変更したりするときに使います。Rのif文の「書き方」、ANDやORを使った複数条件の指定の仕方などを、サンプルを交えてまとめ...
R 使い方 関数 スクリプトの書き方
Rの使い方として、プログラムの基本構成となる関数の作り方について。とにかく早く問題解決したい人はこちら>>直接、データ解析相談R 使い方 関数を利用したプログラムメッセージの表示や、メッセージの長さを取得する関数を作成します。関数は、「関数...
R 使い方 Hello World スクリプトの書き方
Rでプログラムを書きます。今回は、プログラムの基本「Hello World!」です。とにかく早く問題解決したい人はこちら>>直接、データ解析相談Hello World プログラムHello Worldプログラムは、プログラムの勉強を開始する...
R 使い方 行列(マトリックス) スクリプトの書き方
Rのマトリックスは、他のプログラミング言語と同様、数値や文字などの1種類のデータを2次元配列として保持するデータ構造です。基本的な構造を理解すれば、Rはもっと使いやすいツールになります。マトリックスの使い方について。とにかく早く問題解決した...
R 使い方 リスト スクリプトの書き方
Rのリストは、他のプログラミング言語と同様、各項目にたいして名前をつけたベクトルです。基本的な構造を理解すれば、Rはもっと使いやすいツールになります。リストの使い方について。とにかく早く問題解決したい人はこちら>>直接、データ解析相談関連記...
R 使い方 ベクトル スクリプトの書き方
Rのベクトルは、他のプログラミング言語と同様、数値や文字などの1種類のデータを順番に保持するデータ構造です。基本的な構造を理解すれば、Rはもっと使いやすいツールになります。Rのベクトルの使い方について。とにかく早く問題解決したい人はこちら>...
R 使い方 データフレーム・ファクター スクリプトの書き方
Rのデータフレーム・ファクターは、他のプログラミング言語のデータ構造とは異なる独特な構造。でも、とてもよく使う構造で、必ず使いこなせるようになりましょう。基本的な構造を理解すれば、Rはもっと使いやすいツールになります。Rのデータフレームとフ...
R 使い方 データ構造まとめ スクリプトの書き方
Rで使うデータ構造をまとめてみます。一気に眺めることで、それぞれの特徴を理解できるかもしれません。とにかく早く問題解決したい人はこちら>>直接、データ解析相談Rのデータ構造ベクトルベクトルは、最も基本的な構造をしています。数値や文字などの1...
R 使い方 データ 読込み テキスト,csv,エクセル,データベース スクリプトの書き方
「統計ソフト R」にデータを読み込むのは簡単です。タブ区切りのデータやエクセル・DBなどからデータを取り込むことができます。とにかく早く問題解決したい人はこちら>>直接、データ解析相談Rにデータを読み込む「統計ソフト R」にデータを読み込む...

関連記事2

R plotのPDFやPNGへの保存 - PDFなら複数の画像保存も可能
Rのplot (グラフ) は、PDFやPNGファイルとして保存することができます。操作は、通常のグラフの描画と同じです。違うところは、前もって保存先のデバイスをオープンし、描画終了後に明示的にクローズするだけです。PDFなら1つのファイルに...
R 使い方 組込みデータセット iris データフレーム・ベクトル・リスト
Rのデータ型について学びます。使うデータは、組込みデータセットの「iris」です。irisの構造を眺めたり要約統計量を求めることで、データフレーム・ベクトル型・リスト型について簡単に学びます。とにかく早く問題解決したい人はこちら>>直接、デ...
ratio 1.5倍は、logFCで何?
bioinfomatics では、ratio や logFC を変動の閾値としてよく使います。ratio 2倍・4倍なら、対数表現も1・2と簡単にわかりますが、1.5倍などを閾値とした場合は、対数で何になるか覚えておくのは大変です。これらは...
R 知っていると便利!パッケージ読込みとヘルプ
Rのインストール済みのパッケージについて調べます。スクリプトがちゃんと動かないとき、「何がインストールされているか?」また、「何がインストールされていないか?」がヒントになるときがあります。とにかく早く問題解決したい人はこちら>>直接、デー...
R 関数 maxの位置・minの位置を求める
Rで、最大値や最小値を求めるのは簡単ですが、「最大値・最小値の位置は?」という問題を考えてみたいと思います。とにかく早く問題解決したい人はこちら>>直接、データ解析相談最大値・最小値を求める最大値・最小値を求めるのは簡単です。最大値を求める...
R 使い方 集計に便利な関数 aggregate
データフレームを使って集計を行う場合に、使いやすい関数があります。aggregate関数です。データフレームの計算にはapply系の関数がよく使われますが、わかりづらいという方にはオススメの方法です。とにかく早く問題解決したい人はこちら>>...
R 使い方 データフレーム 累積和を求める
データフレームやmatrixで累積和を求める機会ありませんか?「前の行の値」に「現在の行の値」を繰り返し足していくことで求められますが、せっかく「R」を使っているのに、for文やインデックスを使って求めるのも残念な感じがします。そんなときは...
R subset関数 データフレームやmatrixからの条件指定による行・列の抽出
R の subset関数は、データフレームやマトリックスから条件にマッチした部分集合を取り出します。条件指定の主なパラメータは、「subset」と「select」です。「subset」では行を抽出するための条件式、「select」では列を抽...
タイトルとURLをコピーしました