Menu

Mencetak output dan membaca input di R (print, cat, readline)

Cara kerja output di R (pencetakan otomatis, print() vs cat(), message()) dan cara membaca input pengguna dengan readline() dan readLines().

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Cara kerja pencetakan di R

R punya kebiasaan yang tidak dimiliki bahasa populer lainnya: di console, kamu sama sekali tidak butuh pernyataan print. Ketik nama sebuah variabel, tekan enter, dan R mencetak nilainya. Itulah pencetakan otomatis (auto-printing), dan itulah sebabnya tutorial R penuh dengan ekspresi tanpa print.

Tapi pencetakan otomatis punya batas yang ketat: ia hanya terjadi untuk ekspresi di tingkat teratas. Di dalam for loop atau isi fungsi, nilai biasa dievaluasi lalu dibuang diam-diam:

x yang sendirian tercetak (karena berada di tingkat teratas), loop pertama tidak mencetak apa pun, dan loop kedua mencetak 1, 2, 3 karena memintanya secara eksplisit. "Loop-ku berjalan tapi tidak menampilkan apa-apa" adalah salah satu pertanyaan R yang paling sering diajukan, dan inilah seluruh jawabannya: di dalam loop dan fungsi, mencetak selalu menjadi tugasmu. (Hal yang sama berlaku saat kamu menjalankan skrip dengan Rscript: apa yang berhasil baris demi baris di console bisa jadi diam di dalam loop.)

print() menampilkan nilai seperti cara R melihatnya, sehingga menjadi alat yang tepat untuk memeriksa data, dan alat yang salah untuk output yang rapi:

Ada dua hal yang menonjol. String tetap memakai tanda kutip: print() menunjukkan representasi yang setia, dan tanda kutip itu memberi tahu bahwa ini nilai character. Dan setiap baris diawali angka dalam kurung siku seperti [1]: itulah indeks elemen pertama di baris itu, jadi saat vector panjang berlanjut ke baris-baris baru, kurung siku di setiap baris memberi tahu dari elemen mana baris itu dilanjutkan. Ini alat bantu membaca vector, bukan gangguan.

Kalau kamu ingin output gaya print() tanpa tanda kutip, print(x, quote = FALSE) dan noquote(x) sama-sama bisa, tapi biasanya yang sebenarnya kamu inginkan pada titik itu adalah cat().

cat(): output untuk manusia

cat() (concatenate-and-print) menulis teks mentah: tanpa tanda kutip, tanpa awalan indeks, dan argumen-argumennya disambung dengan spasi. Harga dari kendali itu adalah tidak ada yang ditambahkan untukmu, termasuk baris baru:

Lupa menulis "\n" adalah ritual wajib setiap pengguna cat(): tanpanya, output berikutnya menempel di baris yang sama. Jadikan kebiasaan untuk mengakhiri pemanggilan cat() dengan "\n".

Perbedaan tanda kutip di antara kedua fungsi itu sebenarnya adalah perbedaan dalam apa yang ditampilkan. print() menampilkan escape sequence sesuai yang kamu ketik; cat() menerapkannya:

print() menampilkan \t dan \n apa adanya di dalam tanda kutip, berguna saat kamu melakukan debug untuk melihat persis apa isi sebuah string. cat() mengubahnya menjadi tab dan baris baru sungguhan, berguna saat kamu menghasilkan output. Pilih berdasarkan tujuan: print() untuk memeriksa, cat() untuk menyajikan.

Laporan berformat: sprintf() + cat()

Argumen cat() yang dipisahkan spasi hanya bisa sampai di situ. Untuk output yang sejajar dan berformat (desimal yang tetap, penghitung yang diberi padding), susun string-nya dengan sprintf() lalu berikan ke cat():

%-8s menambahkan padding pada setiap nama sampai 8 karakter dan %6.2f memberi setiap skor lebar yang sama dengan dua desimal, sehingga kolom-kolomnya sejajar. Pasangan ini adalah andalan base R untuk pesan progres dan laporan teks kecil (kode formatnya dibahas di string).

message() dan warning(): saluran lainnya

cat() dan print() menulis ke standard output, aliran yang menampung hasil programmu. message() dan warning() menulis ke standard error, aliran untuk komentar tentang jalannya program:

Di layar keduanya terlihat mirip, tapi pemisahan itu penting begitu output dialihkan: alirkan stdout skripmu ke sebuah file, maka 42 masuk ke file sementara catatan statusnya tetap di terminal. Itulah aturan praktisnya: hasil ke stdout dengan cat(), komentar ke stderr dengan message(). Itu juga alasan message() (bukan cat()) menjadi cara yang sopan bagi fungsi dan package untuk berbicara kepada penggunanya: pemanggil bisa membungkamnya dengan suppressMessages() tanpa kehilangan output yang sebenarnya.

warning() lebih tegas ("ada yang janggal, tapi aku tetap lanjut"), dan saat skrip berjalan di bawah Rscript, warning dikumpulkan dan ditampilkan bersama di akhir, bukan di tengah-tengah (lihat debugging error untuk cara membacanya).

Membaca input pengguna: readline() dan readLines()

Untuk mengajukan pertanyaan kepada pengguna di sesi interaktif (console R atau RStudio), pakai readline(). Contoh-contoh ini tidak bisa dijalankan di editor yang tertanam di halaman ini, karena editornya tidak punya panel input, jadi coba di console lokal:

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

Ada dua hal yang perlu diingat. readline() selalu mengembalikan string: konversi dengan as.numeric() sebelum menghitung, dan periksa apakah hasilnya NA kalau-kalau pengguna mengetik sesuatu yang bukan angka. Dan di skrip yang tidak interaktif, readline() sama sekali tidak menunggu input; fungsi itu langsung mengembalikan "".

Untuk skrip yang dijalankan dengan Rscript dan perlu membaca input yang dialirkan atau diketik, baca dari standard input sebagai gantinya:

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

readLines(con = "stdin") tanpa n membaca setiap baris sampai input-nya habis, bentuk standar untuk skrip bergaya filter. Membaca file data adalah pekerjaan yang berbeda dengan alat yang lebih baik; mulai dari read-csv saat input-mu adalah dataset, bukan keyboard.

Yang kamu bawa pulang

  • Pencetakan otomatis hanya terjadi di tingkat teratas; di dalam loop dan fungsi, panggil sendiri print() atau cat().
  • print() memeriksa: tanda kutip pada string, awalan indeks [1], escape ditampilkan apa adanya.
  • cat() menyajikan: teks mentah, argumen disambung dengan spasi, dan kamu yang menambahkan "\n".
  • sprintf() + cat() adalah pola base R untuk output yang berformat dan sejajar.
  • Hasil ke stdout (cat), komentar ke stderr (message, warning).
  • readline() untuk input interaktif (selalu berupa string!); readLines(con = "stdin") untuk Rscript.

Berikutnya: operator, yaitu aritmetika, perbandingan, dan operator logika yang menggerakkan setiap kondisi yang akan kamu tulis.

Pertanyaan yang sering diajukan

Apa perbedaan print() dan cat() di R?

print() menampilkan nilai sesuai cara R merepresentasikannya: string tetap memakai tanda kutip dan setiap baris mendapat awalan indeks gaya [1]. cat() menulis teks mentah tanpa tanda kutip, tanpa indeks, dan tanpa baris baru otomatis (kamu sendiri yang menambahkan "\n"). Pakai print() untuk memeriksa objek, cat() untuk menghasilkan output yang dibaca manusia.

Kenapa loop R-ku tidak mencetak apa pun?

Pencetakan otomatis hanya terjadi untuk ekspresi di tingkat teratas. Di dalam for loop atau isi fungsi, x biasa dievaluasi lalu dibuang diam-diam. Bungkus secara eksplisit: print(x) atau cat(x, "\n").

Bagaimana cara membaca input pengguna di R?

Di sesi interaktif, readline("prompt: ") membaca satu baris input yang diketik sebagai string (konversi dengan as.numeric() kalau kamu butuh angka). Di skrip yang dijalankan dengan Rscript, readline() tidak menunggu; baca dari standard input dengan readLines(con = "stdin", n = 1) sebagai gantinya.

Bagaimana cara mencetak tanpa tanda kutip di R?

Pakai cat("hello\n"), yang tidak pernah menambahkan tanda kutip. Kalau kamu memang ingin cara kerja print() tanpa tanda kutip, print("hello", quote = FALSE) atau noquote("hello") juga bisa dipakai.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai