打印文本
也许查看文本是我们对文本所能做的最基础的事情。R 提供了许多在控制台中查看文
本的方式。
最简单的方式是,直接在引号中输入文本:
"Hello"
## [1] "Hello"
如同由浮点数组成的数值向量,一个字符向量是一个由字符值或字符串组成的向量。
Hello 是我们刚刚创建的字符向量中的第 1 个,也是唯一一个元素。
我们也可以通过简单地执行某个变量,打印出存储在该变量中的字符串:
str1 <- "Hello"
str1
## [1] "Hello"
然而,如果只是简单地将字符串放进循环中,R 并不会将其迭代打印。下面这个循环
不会打印出任何东西:
for (i in 1:3){
"Hello"
}
这是因为 R 只会自动地打印出一个表达式的值,就好像是在控制台中输入一样。一个
for 循环并没有明确地返回一个值。这个行为也解释了当运行以下两个函数时打印方式的不
同,分别是:
test1 <- function(x) {
"Hello"
x
}
test1("World")
## [1] "World"
在上面的输出结果中,test1 并没有打印出 Hello,而是打印出了 World。这是因
为 test1("World")返回最后一个表达式 x 的值:World,这个值是函数调用的,并且
自动打印出来。假设我们从函数中移除了 x,如下:
test2 <- function(x) {
"Hello"
}
test2("World")
## [1] "Hello"
此时,因为函数体内只有“Hello”这一个表达式,而没有与 x 对应的表达式。所以,
不论x 如何取值,test2 永远只会返回Hello。因此,R 自动打印出表达式test2("World")
的值,也就是 Hello。
如果想要明确地打印一个对象,我们应该使用 print( ):
print(str1)
## [1] "Hello"
这样,字符向量中位置[1]的元素会被打印出来,这在循环中也是可行:
for (i in 1:3) {
print(str1)
}
## [1] "Hello"
## [1] "Hello"
## [1] "Hello"
同样,在函数中也是可行的:
test3 <-function(x) {
print("Hello")
x
}
test3("World")
## [1] "Hello"
## [1] "World"
有些情况下,我们希望输出文本就像输出一条信息一样,而不是带索引的字符向量。
此时,可以调用 cat( )或者 message( ):
cat("Hello")
## Hello
我们可以通过一种更加灵活的方式编辑信息:
name <- "Ken"
language <- "R"
cat("Hello,", name, "- a user of", language)
## Hello, Ken - a user of R
我们改变输入方式,打印出更加正式的句子:
cat("Hello, ", name, ", a user of ", language, ".")
## Hello, Ken , a user of R .
看起来,连接好的字符串在不同的参数之间使用了不必要的空白。这是因为在输入的
字符串之间,默认使用空格作为分隔符。我们可以指定 sep=参数 来改变它。在下面的例
子中,我们将避免默认的空格分隔符,而是手动地将空格写入到输入字符串中,创造一个
正确的版本:
cat("Hello, ", name, ", a user of ", language, ".", sep ="")
## Hello, Ken, a user of R.
另一个函数是 message( ),它经常在相对严肃的场合使用,例如陈述重要事件,其
输出文本更引人注目。message( )与 cat( )的区别在于,massage( )不会自动使用
空格分隔符来连接输入字符串:
message("Hello, ", name, ", a user of ", language, ".")
## Hello, Ken, a user of R.
为了得到相同的文本,使用 message( )的时候,我们手动加上了空格分隔符。
message( )与 cat( )的另一个区别是,message( )会自动地以换行作为文本结
尾,而 cat( )不会。
接下来的两个例子演示了这个区别。我们想要打印出相同的内容,却得到了不同的结果:
for (i in 1:3) {
cat(letters[[i]])
}
## abc
for (i in 1:3) {
message(letters[[i]])
}
## a
## b
## c
显然,每次调用 cat( ),输入的字符串不会被换行打印,结果就是 3 个字母出现在同一
行中。相反地,每次调用 message( ),每输入一个字符串就会出现在新的一行中。因此,3
个字母出现在 3 行中。为了在使用 cat( )时,也将每个字母输出在新行中,我们需要明确地
在输入中添加一个换行符。下面的代码输出了和前面例子中 message( )一样的内容:
for (i in 1:3) {
cat(letters[[i]], "\n", sep ="")
}
## a
## b
## c