处理文件
本课属于 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 会逐行读取它。顺序很重要:只有在定义函数的文件被加载后,该函数才会存在,因此 source() 语句要放在顶部:
# main.R
cat(greeting("Ada"), "\n") # 错误:找不到函数 "greeting"
source("Greeting.R")
cat(greeting("Ada"), "\n") # 可以运行了:greeting() 函数现在已存在通常的布局是每个文件放一个类,文件名与类名相同:Account.R 存放 account 构造函数及其方法,Shape.R 存放 shape 泛型。在本单元的挑战中,你要把代码写入这些文件;main.R 存放提供的输入/输出代码,其顶部已经按正确顺序写好了 source() 行。编辑器会将每个文件显示为一个标签页。
Shape.R # 所有形状共用的泛型函数:先加载这个文件
Circle.R # 圆形类及其方法
main.R # source("Shape.R"); source("Circle.R"); 读取输入并打印结果source() 会在全局环境中运行文件,因此其中的函数和变量会成为全局名称。R 没有文件私有名称:如果两个文件都定义了 helper(),最后加载的文件会覆盖之前的定义。在被加载的文件中,单独占一行的值也不会被打印出来,因此需要显示内容的文件会调用 cat():
# Tools.R
total <- 0 # 通过 source() 加载后成为全局变量
42 # 不会由 source() 打印
helper <- function(x) x * 2
# Other.R
helper <- function(x) x + 1 # 稍后通过 source() 加载:替换上面的 helper挑战
简单这个程序有两个文件。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 在线编译器