也许查看文本是我们对文本所能做的最基础的事情。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