ファイル操作
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 1/57。
実際のプログラムは複数のファイルに分割されています。Rでは、source("Greeting.R")を実行すると別のファイルが先頭から末尾まで実行され、そのファイルで定義されたすべての関数がその後使用できるようになります。
# Greeting.R
greeting <- function(name) {
paste0("Hello, ", name, "!")
}
# main.R
source("Greeting.R")
cat(greeting("Ada"), "\n")main.Rを実行するとHello, Ada!が出力されます。source()の行でgreeting()を読み込んでから、main.Rでそれを呼び出すためです。
プログラムは、実行するファイル(ここでは main.R)から開始され、R はそのファイルを1行ずつ読み込みます。順序が重要です。関数は、それを定義するファイルが読み込まれた後にのみ存在するため、source() の行は先頭に置きます:
# main.R
cat(greeting("Ada"), "\n") # エラー: 関数 "greeting" が見つかりませんでした
source("Greeting.R")
cat(greeting("Ada"), "\n") # 動作します: greeting() が使えるようになりました一般的な構成では、クラスごとに1つのファイルを用意し、クラス名をファイル名にします。Account.Rにはaccountコンストラクターとそのメソッドを、Shape.Rにはshapeジェネリックを記述します。このセクションの課題では、コードをそれらのファイルに記述します。main.Rには用意された入出力コードがあり、先頭には正しい順序でsource()の行がすでに記述されています。エディターでは各ファイルがタブとして表示されます。
Shape.R # すべての図形で共通して使うジェネリック関数:最初にsourceする
Circle.R # 円のクラスとそのメソッド
main.R # source("Shape.R"); source("Circle.R"); 入力を読み取り、結果を出力するsource() はファイルをグローバル環境で実行するため、その関数や変数はグローバル名になります。R にはファイル内に限定された名前はありません。2 つのファイルで helper() を定義すると、後から source されたファイルの定義が優先されます。また、source されたファイル内で単独の行にある値は出力されないため、何かを表示するファイルでは cat() を呼び出します。
# Tools.R
total <- 0 # 読み込まれるとグローバル変数になる
42 # source() では出力されない
helper <- function(x) x * 2
# Other.R
helper <- function(x) x + 1 # 後で読み込まれ、上記の helper を置き換えるチャレンジ
簡単このプログラムには2つのファイルがあります。main.R は Greeting.R を読み込み、名前を読み取って、それぞれについて greeting(name) の結果を出力します。Greeting.R の greeting() を完成させ、名前が Ada の場合は Hello, Ada! を、名前が空の場合は Hello, friend! を返すようにしてください。
コードは Greeting.R に記述してください。main.R には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
source("Greeting.R")
# 提供された入出力コード: そのままにしてください
input <- suppressWarnings(readLines(file("stdin")))
for (name in input) cat(greeting(name), "\n", sep = "")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ