Operator yang Disediakan R
Operator R terbagi menjadi empat kelompok kerja: aritmetika (+ - * / ^ %% %/%), perbandingan (== != < <= > >=), logika (& | && || ! xor), dan uji keanggotaan %in%. Dua hal membuatnya berbeda dari kebanyakan bahasa: hampir semuanya tervektorisasi, artinya bekerja pada seluruh vector sekaligus, elemen demi elemen, dan R punya dua operator AND dan dua operator OR yang tidak bisa saling menggantikan. Halaman ini membahas semuanya, ditambah jebakan prioritas yang diam-diam menghasilkan jawaban salah.
Aritmetika: +, -, *, /, ^, %% dan %/%
Lima yang pertama bekerja sesuai dugaanmu. Dua yang diapit tanda persen, %% (modulo, sisa bagi) dan %/% (pembagian bilangan bulat, hasil bagi), adalah yang paling sering dicari orang:
Perhatikan bahwa / selalu melakukan pembagian floating-point: 17 / 5 adalah 3.4, tidak pernah 3. Kalau kamu ingin bagian bilangan bulatnya, itulah gunanya %/%.
Tugas sehari-hari %% adalah keterbagian. Sebuah angka genap ketika dibagi 2 tidak menyisakan apa pun:
Baris kedua itu layak diperhatikan: dengan operand negatif, %% di R mengembalikan hasil dengan tanda pembagi (-7 %% 3 adalah 2, karena -7 = -3 * 3 + 2). Beberapa bahasa melakukannya sebaliknya; kalau kamu memindahkan kode dari bahasa lain, periksa dulu.
Operator Perbandingan Itu Tervektorisasi
==, !=, <, <=, >, >= membandingkan elemen demi elemen dan mengembalikan vector logika, bukan satu jawaban:
Inilah mesin di balik hampir semua pemfilteran di R: kamu membandingkan seluruh vector dengan sebuah nilai, mendapatkan mask logika, lalu memakai mask itu untuk mengambil subset. Satu peringatan soal == pada desimal: angka floating-point disimpan secara perkiraan, jadi 0.1 + 0.2 == 0.3 bernilai FALSE. Untuk membandingkan desimal, lebih baik pakai all.equal() atau periksa abs(x - y) < 1e-9.
Operator Logika: & vs && (Kebingungan Klasik)
R punya dua operator AND dan dua operator OR, dan salah memilih adalah pengalaman yang dialami hampir semua orang.
& dan | tervektorisasi. Keduanya menggabungkan dua vector logika elemen demi elemen:
Pakai keduanya setiap kali kamu membuat filter atas data: df[df$age > 30 & df$city == "Lisbon", ].
&& dan || bekerja pada skalar dan melakukan short-circuit. Keduanya menerima nilai tunggal, mengembalikan satu TRUE/FALSE, dan melewati operand kedua sepenuhnya kalau operand pertama sudah menentukan jawabannya:
Baris kedua itu menunjukkan short-circuit: karena x < 0 bernilai FALSE, R tidak pernah mengevaluasi panggilan stop(). Inilah alasan && cocok untuk kondisi if(): kamu bisa menulis if (!is.na(x) && x > 10) dan bagian x > 10 aman dilewati ketika x bernilai NA.
Patokannya: &/| untuk vector dan pemfilteran data, &&/|| untuk kondisi if(). Dan sejak R 4.3, aturan ini ditegakkan dengan tegas: memberi && atau || vector yang panjangnya lebih dari 1 menghasilkan error (versi R lama diam-diam hanya memakai elemen pertama, yang menyembunyikan bug nyata selama bertahun-tahun).
xor(a, b) melengkapi kelompok ini: TRUE ketika tepat satu dari keduanya TRUE:
%in%: Menguji Keanggotaan
x %in% table bertanya, untuk setiap elemen x, "apakah ini muncul di mana saja dalam table?" Ini salah satu operator yang paling sering dipakai di kode R sungguhan:
Sisi yang diuji bisa berupa seluruh vector, sehingga %in% menjadi alat yang wajar untuk memfilter baris berdasarkan sekumpulan nilai yang diizinkan.
Ia juga lebih baik daripada alternatif yang biasanya kamu tulis, yaitu rangkaian == yang disambung dengan |:
Dengan lima nilai yang diizinkan, rangkaian == berubah menjadi tembok pengulangan; versi %in% cukup memperpanjang vectornya. Ada keunggulan kedua yang lebih halus: %in% tidak pernah mengembalikan NA:
NA == 1 bernilai NA karena R tidak bisa tahu apakah nilai yang tidak diketahui sama dengan 1, perilaku yang dibahas tuntas di nilai yang hilang. NA itu lalu merusak setiap if() yang ia capai. %in% menghindari seluruh masalah ini dengan selalu menjawab TRUE atau FALSE, itulah sebabnya ia pilihan yang lebih aman untuk kondisi pada data yang mungkin hilang.
Jebakan Prioritas
Dua jebakan prioritas operator menyumbang porsi besar dari momen "R rusak". Pertama, ^ mengikat lebih kuat daripada minus unary:
Kedua, titik dua mengikat lebih kuat daripada aritmetika biner:
Kalau ragu, tambahkan tanda kurung. Tanda kurung tidak ada ruginya, dan setiap pembaca (termasuk dirimu di masa depan) membacanya dengan cara yang sama seperti interpreter.
$ dan [ ]: Operator Akses
Kamu juga akan terus melihat $, [ ], dan [[ ]]. Secara teknis ini juga operator, dipakai untuk mengambil nilai dari dalam struktur, bukan untuk menghitung:
Semuanya dibahas lengkap di halaman tentang vector, list, dan data frame. Di sini cukup kenali bahwa mereka anggota keluarga operator yang sama.
Yang Perlu Kamu Ingat
%%memberi sisa bagi,%/%memberi hasil bagi bilangan bulat;x %% 2 == 0menguji bilangan genap.- Perbandingan itu tervektorisasi: hasilnya vector logika yang bisa kamu pakai untuk memfilter.
&/|menggabungkan vector elemen demi elemen;&&/||untuk nilai tunggal diif()dan melakukan short-circuit. Sejak R 4.3,&&pada vector yang lebih panjang menghasilkan error.x %in% tablemenggantikan rangkaian==dan tidak pernah mengembalikanNA.-2^2adalah-4dan1:n - 1dimulai dari 0, jadi pakai tanda kurung kalau ragu.
Berikutnya: menerapkan operator-operator ini di dalam if, else, dan ifelse(), pernyataan percabangan di R.
Pertanyaan yang sering diajukan
Apa fungsi %% di R?
%% adalah operator modulo: ia mengembalikan sisa pembagian. 17 %% 5 adalah 2. Pasangannya, %/%, melakukan pembagian bilangan bulat dan mengembalikan hasil bagi tanpa sisanya: 17 %/% 5 adalah 3. Pemakaian klasik %% adalah menguji bilangan genap: x %% 2 == 0.
Apa bedanya & dan && di R?
& tervektorisasi: ia membandingkan dua vector elemen demi elemen dan mengembalikan vector dengan panjang yang sama. && hanya bekerja pada nilai tunggal, melakukan short-circuit (melewati operand kedua kalau operand pertama sudah menentukan hasilnya), dan mengembalikan tepat satu TRUE atau FALSE. Pakai & saat memfilter vector, dan && di dalam kondisi if(). Sejak R 4.3, memberi && atau || vector yang panjangnya lebih dari 1 menghasilkan error, bukan peringatan.
Apa fungsi %in% di R?
x %in% table menguji apakah setiap elemen x muncul di mana saja dalam table, dan mengembalikan TRUE atau FALSE per elemen. "mango" %in% basket menggantikan rangkaian perbandingan == yang disambung dengan |, dan tidak seperti ==, ia tidak pernah mengembalikan NA: nilai yang hilang di sisi yang diuji hanya menghasilkan FALSE.
Kenapa -2^2 mengembalikan -4 di R?
Karena ^ mengikat lebih kuat daripada minus unary, R membaca -2^2 sebagai -(2^2), yaitu -4. Kalau yang kamu maksud kuadrat dari minus dua, tulis (-2)^2, yang hasilnya 4. Titik dua punya jebakan serupa: 1:n - 1 berarti (1:n) - 1, bukan 1:(n - 1).