2015-08-05 12 views
17

cat i print zarówno wydają się oferować „print” funkcjonalność R.Jaka jest różnica między kotem a nadrukiem?

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

Mam wrażenie, że cat najbardziej przypomina typową funkcję „Drukuj”. Kiedy używam cat i kiedy używam print?

+0

Zobacz tutaj: https://stat.ethz.ch/pipermail/r-help/2004-September/056972.html –

+0

możliwy duplikat [Różnica między łączącymi się ciągami znaków za pomocą paste() vs. cat()?] (http://stackoverflow.com/questions/12775085/the-difference-between-concatenating-character-strings-with-paste- vs-cat) – MichaelChirico

Odpowiedz

25

cat odnosi się tylko do typów atomowych (logicznych, całkowitych, rzeczywistych, złożonych, znaków) i nazw. Oznacza to, że nie można wywołać cat na niepustej liście ani żadnym typie obiektu. W praktyce po prostu konwertuje argumenty na znaki i łączy się, abyś mógł wymyślić coś takiego, jak as.character() %>% paste().

print to funkcja ogólna, dzięki czemu można zdefiniować konkretną implementację dla określonej klasy 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" 

Kolejna różnica między cat i drukiem jest wartością zwracaną. cat niewidocznie zwraca NULL, a print zwraca jego argument. Ta właściwość print czyni go szczególnie przydatnym w połączeniu z rurami:

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

Większość czasu to, co chcesz print. cat puszka przydatna dla rzeczy jak pisanie ciąg do pliku:

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

Jak pointed przez baptiste można użyć cat przekierować wyjście bezpośrednio do pliku. Więc odpowiednikiem powyższego byłoby coś takiego:

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

Jeśli chcesz pisać wiersze stopniowo należy użyć append argument:

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

porównaniu do sink podejścia jest daleko do verbose na mój gust , ale nadal jest opcja.

+1

Także: '? cat' i'? print' – MichaelChirico

+2

dlaczego użyłbym sink(), gdy cat() ma argument pliku? – baptiste

+1

@baptiste Ma, ale jeśli chcesz napisać wiele linii przechodzących zarówno 'file', jak i' append = TRUE', jest to dość nużące. – zero323

4

Zasadnicza różnica między cat a print jest klasą zwracanych obiektów. Ta różnica ma praktyczne konsekwencje dla tego, co możesz zrobić ze zwróconym obiektem.

print zwraca wektor znaków:

> 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 zwraca obiekt klasy 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" 

W niektórych przypadkach ważne jest, aby powrócić wyjście jak w konsoli, na przykład gdy chcesz skopiować i wkleić wyjście. W takich przypadkach naprawdę nie chcesz zwracać wektora znaków. W tych przypadkach okazało się przydatna strategia łączenia print i cat: Użyj obiektu print, aby utworzyć obiekt, użyj cat, aby wydrukować go na konsoli.

> 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 

Korzystanie xtable pakiet do drukowania tabel LaTeX w 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

print (często) zwraca wartość podaną na wejściu. Stąd: class (print (1: 3)) zwróci liczbę całkowitą. –

Powiązane problemy