cat
和print
似乎都在R中提供“打印”功能。
x <- 'Hello world!\n'
cat(x)
# Hello world!
print(x)
# [1] "Hello world!\n"
我的印象是cat
最类似于典型的“打印”功能。我何时使用cat
,何时使用print
?
答案 0 :(得分:30)
cat
仅对原子类型(逻辑,整数,实数,复数,字符)和名称有效。这意味着您无法在非空列表或任何类型的对象上调用cat
。在实践中,它只是将参数转换为字符和连接,这样您就可以想到as.character() %>% paste()
。
print
是一个通用函数,因此您可以为某个S3类定义特定的实现。
> foo <- "foo"
> print(foo)
[1] "foo"
> attributes(foo)$class <- "foo"
> print(foo)
[1] "foo"
attr(,"class")
[1] "foo"
> print.foo <- function(x) print("This is foo")
> print(foo)
[1] "This is foo"
cat
和print之间的另一个区别是返回值。 cat
无形地返回NULL
,而print
返回其参数。 print
的此属性使其在与管道结合使用时特别有用:
coefs <- lm(Sepal.Width ~ Petal.Length, iris) %>%
print() %>%
coefficients()
大多数时候你想要的是print
。 cat
可以用于将字符串写入文件:
sink("foobar.txt")
cat('"foo"\n')
cat('"bar"')
sink()
pointed作为baptiste,您可以使用cat
将输出直接重定向到文件。所以相当于上面的内容将是这样的:
cat('"foo"', '"bar"', file="foobar.txt", sep="\n")
如果要逐步编写行,则应使用append
参数:
cat('"foo"', file="foobar.txt", append=TRUE)
cat('"bar"', file="foobar.txt", append=TRUE)
与sink
方法相比,我的口味远非冗长,但它仍然是一种选择。
答案 1 :(得分:5)
cat
和print
之间的本质区别是它们返回的对象的类。这种差异对您可以对返回的对象执行的操作产生实际影响。
print
返回一个字符向量:
> print(paste("a", 100* 1:3))
[1] "a 100" "a 200" "a 300"
> class(print(paste("a", 100* 1:3)))
[1] "a 100" "a 200" "a 300"
[1] "character"
cat
返回类NULL
的对象。
> cat(paste("a", 100* 1:3))
a 100 a 200 a 300
> class(cat(paste("a", 100* 1:3)))
a 100 a 200 a 300[1] "NULL"
在某些情况下,重要的是在控制台中按原样返回输出,例如,当您要复制粘贴输出时。在这些情况下,你真的不想返回一个字符向量。在这些情况下,我发现合并print
和cat
是一种有用的策略:使用print
创建对象,使用cat
将其打印到控制台。
> output <- print(paste("a", 100* 1:3)) # use print to create the object
> cat(output) # use cat to print it *as is* to your console
a 100 a 200 a 300
使用xtable
包在R:
> require(xtable)
> df <- data.frame(a = 1, č = 5) # dataframe with foreign characters
> output <- print(xtable(df), include.rownames = FALSE)
> output <- gsub("č", "c", output) # replace foreign characters before
> # copying to LaTeX
> cat(output)
\begin{table}[ht]
\centering
\begin{tabular}{rr}
\hline
a & c \\
\hline
1.00 & 5.00 \\
\hline
\end{tabular}\end{table}
> print(output)
[1] "\\begin{table}[ht]\n\\centering\n\\begin{tabular}{rr}\n
\hline\na & c \\\\ \n \\hline\n1.00 & 5.00 \\\\ \n
\\hline\n\\end{tabular}\n\\end{table}\n"