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.
Zobacz tutaj: https://stat.ethz.ch/pipermail/r-help/2004-September/056972.html –
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