ファイル操作
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() の行によって main.R がそれを呼び出す前に greeting() が読み込まれるためです。
プログラムは、ここでは実行するファイルである 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 # すべての shape で共有される generics: 最初に source する
Circle.R # circle クラスとそのメソッド
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オンラインコンパイラ