Menu

R'de Çıktı Yazdırma ve Girdi Okuma (print, cat, readline)

R'de çıktı nasıl çalışır - otomatik yazdırma, print() ile cat() farkı, message() - ve readline() ile readLines() kullanarak kullanıcı girdisi nasıl okunur.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

R'de Yazdırma Nasıl Çalışır

R'nin, yaygın hiçbir dilin paylaşmadığı bir alışkanlığı vardır: konsolda hiçbir yazdırma ifadesine ihtiyacınız yoktur. Bir değişkenin adını yazın, enter'a basın, R değerini yazdırır. Bu otomatik yazdırmadır ve R eğitimlerinin neden yalın ifadelerle dolu olduğunu açıklar.

Ama otomatik yazdırmanın katı bir sınırı vardır: yalnızca en üst düzeydeki ifadeler için tetiklenir. Bir for döngüsünün ya da fonksiyon gövdesinin içinde yalın bir değer değerlendirilir ve sessizce atılır:

Tek başına duran x yazdırılır (en üst düzeydedir), ilk döngü hiçbir şey yazdırmaz ve ikincisi açıkça istediği için 1, 2, 3 yazdırır. "Döngüm çalışıyor ama hiçbir şey göstermiyor", en çok sorulan R sorularından biridir ve yanıtın tamamı budur: döngülerin ve fonksiyonların içinde yazdırmak her zaman sizin işinizdir. (Aynısı bir betiği Rscript ile çalıştırdığınızda da geçerlidir - konsolda satır satır çalışan şey bir döngünün içinde susabilir.)

print() bir değeri R'nin gördüğü biçimde gösterir - bu da onu veriyi incelemek için doğru, cilalı çıktı için yanlış araç yapar:

İki şey dikkat çeker. Metinler tırnaklarını korur - print() size sadık bir temsil gösteriyor ve tırnaklar bunun bir character değer olduğunu söylüyor. Ayrıca her satır [1] gibi köşeli parantez içinde bir sayıyla başlar: bu, o satırdaki ilk elemanın indeksidir; böylece uzun bir vektör yeni satırlara sardığında her satırın parantezi hangi elemandan devam ettiğini söyler. Bu, vektörler için bir okuma yardımıdır, gürültü değil.

Tırnaksız print() tarzı çıktı istiyorsanız hem print(x, quote = FALSE) hem de noquote(x) bunu yapar - ama o noktada genellikle asıl istediğiniz şey cat()'tir.

cat(): İnsanlar İçin Çıktı

cat() (birleştir-ve-yazdır) ham metin yazar: tırnak yok, indeks öneki yok ve argümanları boşluklarla birleştirilir. Bu denetimin bedeli, yeni satır dahil sizin için hiçbir şeyin eklenmemesidir:

"\n" unutmak evrensel cat() erginlenme törenidir - onsuz bir sonraki çıktı parçası aynı satıra yapışır. cat() çağrılarını "\n" ile bitirmeyi refleks hâline getirin.

İki fonksiyon arasındaki tırnak farkı aslında ne gösterdikleri farkıdır. print() kaçış dizilerini siz yazdığınız gibi gösterir; cat() ise onları işler:

print(), \t ve \n karakterlerini tırnak içinde harfiyen gösterir - bir metnin tam olarak ne içerdiğinde hata ayıklarken kullanışlıdır. cat() ise onları gerçek bir sekmeye ve gerçek bir satır sonuna çevirir - çıktı üretirken kullanışlıdır. Niyete göre seçin: incelemek için print(), sunmak için cat().

Biçimlendirilmiş Raporlar: sprintf() + cat()

cat()'in boşlukla ayrılmış argümanları yalnızca belli bir yere kadar götürür. Hizalı, biçimlendirilmiş çıktı için - sabit ondalıklar, doldurulmuş sayaçlar - metni sprintf() ile kurun ve cat()'e verin:

%-8s her ismi 8 karaktere doldurur ve %6.2f her puana aynı genişliği ve iki ondalık basamağı verir, böylece sütunlar hizalanır. Bu ikili, ilerleme mesajları ve küçük metin raporları için temel R'nin beygiridir (biçim kodları metinler sayfasında ele alınıyor).

message() ve warning(): Diğer Kanal

cat() ve print() standart çıktıya yazar - programınızın sonuçlarını taşıyan akışa. message() ve warning() ise çalışma hakkındaki yorumlara ayrılmış akış olan standart hataya yazar:

Ekranda ikisi de benzer görünür, ama çıktı yönlendirildiği anda bu ayrım önem kazanır: betiğinizin stdout'unu bir dosyaya boru ile aktarın; 42 dosyaya düşerken durum notu terminalde kalır. Genel kural budur - sonuçlar cat() ile stdout'a, yorumlar message() ile stderr'e. Fonksiyonların ve paketlerin kullanıcılarıyla konuşmasının kibar yolunun cat() değil message() olmasının nedeni de budur: çağıranlar gerçek çıktıyı kaybetmeden suppressMessages() ile onu susturabilir.

warning() daha güçlüdür - "bir şey ters, ama devam ettim" - ve bir betik Rscript altında çalıştığında uyarılar toplanıp satır arasında değil sonda birlikte gösterilir (onları okumak için bkz. hata ayıklama).

Kullanıcı Girdisi Okuma: readline() ve readLines()

Etkileşimli bir oturumda (R konsolu ya da RStudio) kullanıcıya soru sormak için readline() kullanın. Bu örnekler gömülü düzenleyicide çalıştırılamaz - sayfadaki çalıştırıcının bir girdi paneli yok - bu yüzden onları yerel bir konsolda deneyin:

# Interactive sessions only:
name <- readline("What is your name? ")
cat("Hello,", name, "\n")

age <- as.numeric(readline("Your age? "))
cat("Next year you'll be", age + 1, "\n")

Hatırlanacak iki şey var. readline() her zaman bir metin döndürür - matematik yapmadan önce as.numeric() ile dönüştürün ve kullanıcı sayı olmayan bir şey yazmış olabileceğinden sonucu NA için kontrol edin. Ayrıca etkileşimli olmayan bir betikte readline() girdiyi hiç beklemez; anında "" döndürür.

Boru ile aktarılan ya da yazılan girdiyi okuması gereken, Rscript ile çalıştırılan bir betik için bunun yerine standart girdiden okuyun:

# In a script run as: echo "Ada" | Rscript greet.R
line <- readLines(con = "stdin", n = 1)
cat("Hello,", line, "\n")

n verilmeden readLines(con = "stdin"), girdi bitene kadar her satırı okur - filtre tarzı betikler için standart biçimdir. Veri dosyalarını okumak, daha iyi araçları olan farklı bir iştir; girdiniz klavye yerine bir veri kümesiyse read-csv ile başlayın.

Buradan Ne Çıkarıyorsunuz

  • Otomatik yazdırma yalnızca en üst düzeyde olur - döngülerin ve fonksiyonların içinde print() veya cat() çağırmak size düşer.
  • print() inceler: metinlerde tırnaklar, [1] indeks önekleri, harfiyen gösterilen kaçışlar.
  • cat() sunar: ham metin, boşluklarla birleştirilen argümanlar ve "\n" ekleme işi size aittir.
  • sprintf() + cat(), biçimlendirilmiş ve hizalı çıktı için temel R kalıbıdır.
  • Sonuçlar stdout'a (cat), yorumlar stderr'e (message, warning) gider.
  • Etkileşimli girdi için readline() (her zaman metin!); Rscript için readLines(con = "stdin").

Sırada: operatörler - aritmetik, karşılaştırma ve yazacağınız her koşulu yürüten mantıksal operatörler.

Sıkça Sorulan Sorular

R'de print() ile cat() arasındaki fark nedir?

print() bir değeri R'nin temsil ettiği biçimde gösterir - metinler tırnaklarını korur ve her satır [1] tarzı bir indeks öneki alır. cat() ise tırnaksız, indekssiz ve otomatik yeni satır olmadan ham metin yazar ("\n" ekleme işi sizindir). Nesneleri incelemek için print(), insanlar için çıktı üretmek için cat() kullanın.

R döngüm neden hiçbir şey yazdırmıyor?

Otomatik yazdırma yalnızca en üst düzeydeki ifadeler için gerçekleşir. Bir for döngüsünün veya fonksiyon gövdesinin içinde yalın bir x değerlendirilir ve sessizce atılır. Açıkça sarın: print(x) ya da cat(x, "\n").

R'de kullanıcı girdisi nasıl okunur?

Etkileşimli bir oturumda readline("prompt: ") yazılan bir satırı metin olarak okur (sayı gerekiyorsa as.numeric() ile dönüştürün). Rscript ile çalıştırılan bir betikte readline() beklemez - bunun yerine standart girdiden readLines(con = "stdin", n = 1) ile okuyun.

R'de tırnaksız nasıl yazdırılır?

cat("hello\n") kullanın - asla tırnak eklemez. Özellikle tırnaksız print() davranışı istiyorsanız print("hello", quote = FALSE) veya noquote("hello") da işe yarar.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA