2015-08-05 40 views
17

catprint cả dường như đưa ra một "in" chức năng trong R.Sự khác biệt giữa mèo và bản in là gì?

x <- 'Hello world!\n' 
cat(x) 
# Hello world! 
print(x) 
# [1] "Hello world!\n" 

ấn tượng của tôi là cat giống hầu hết các điển hình "in" chức năng. Khi nào tôi sử dụng cat và khi nào tôi sử dụng print?

+0

Xem ở đây: https://stat.ethz.ch/pipermail/r-help/2004-September/056972.html –

+0

có thể trùng lặp của [Sự khác biệt giữa các chuỗi ký tự ghép với dán() so với cat()?] (http://stackoverflow.com/questions/12775085/the-difference-between-concatenating-character-strings-with-paste- vs-cat) – MichaelChirico

Trả lời

25

cat chỉ hợp lệ cho các loại nguyên tử (logic, số nguyên, thực, phức tạp, ký tự) và tên. Điều đó có nghĩa là bạn không thể gọi số cat trên danh sách không trống hoặc bất kỳ loại đối tượng nào. Trong thực tế, nó chỉ đơn giản là chuyển đổi các đối số thành các ký tự và ghép lại để bạn có thể nghĩ ra một số thứ như as.character() %>% paste().

print là một hàm chung để bạn có thể xác định triển khai cụ thể cho một lớp S3 nhất định.

> 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" 

Sự khác biệt giữa cat và in được trả về giá trị. cat trả lại vô hình NULL trong khi print trả về đối số của nó. tài sản của print này làm cho nó đặc biệt hữu ích khi kết hợp với ống:

coefs <- lm(Sepal.Width ~ Petal.Length, iris) %>% 
     print() %>% 
     coefficients() 

Phần lớn thời gian những gì bạn muốn là print. cat lon hữu ích cho những thứ như viết một chuỗi sang file:

sink("foobar.txt") 
cat('"foo"\n') 
cat('"bar"') 
sink() 

Như pointed bởi baptiste bạn có thể sử dụng cat để chuyển hướng đầu ra trực tiếp đến nộp. Vì vậy, tương đương với trên sẽ là một cái gì đó như thế này:

cat('"foo"', '"bar"', file="foobar.txt", sep="\n") 

Nếu bạn muốn viết dòng từng bước bạn nên sử dụng append luận:

cat('"foo"', file="foobar.txt", append=TRUE) 
cat('"bar"', file="foobar.txt", append=TRUE) 

So với sink cách tiếp cận nó là xa là Verbose cho hương vị của tôi , nhưng nó vẫn là một lựa chọn.

+1

Ngoài ra: '? cat' và'? print' – MichaelChirico

+2

tại sao lại sử dụng sink(), khi cat() có đối số tập tin? – baptiste

+1

@baptiste Nó có, nhưng nếu bạn muốn viết nhiều dòng đi qua cả hai 'tập tin' và' append = TRUE' là loại tẻ nhạt. – zero323

4

Sự khác biệt cần thiết giữa catprint là lớp của đối tượng mà chúng trả về. Sự khác biệt này có những hậu quả thực tế cho những gì bạn có thể làm với đối tượng được trả về.

print trả về một vector nhân vật:

> 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 trả về một đối tượng của lớp 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" 

Trong một số trường hợp, điều quan trọng là trả lại kết quả như trong bảng điều khiển của bạn, ví dụ: khi bạn muốn sao chép-dán đầu ra. Trong những trường hợp đó, bạn thực sự không muốn trả về một vector ký tự. Tôi thấy đó là một chiến lược hữu ích trong những trường hợp đó để kết hợp printcat: Sử dụng print để tạo đối tượng, sử dụng cat để in nó vào bảng điều khiển của bạn.

> 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 

Sử dụng xtable gói để in bảng LaTeX trong 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" 
+1

in (thường) trả về giá trị đã được đưa ra trong đầu vào. Do đó: class (print (1: 3)) sẽ trả về một số nguyên. –

Các vấn đề liên quan