Menurut definisi bahasa R , perbedaan antara &
dan &&
(sesuai |
dan ||
) adalah bahwa yang pertama adalah vektor sedangkan yang terakhir tidak.
Menurut teks bantuan , saya membaca perbedaan yang mirip dengan perbedaan antara "Dan" dan "Dan juga" (sesuai "Atau" dan "OrElse") ... Artinya: Itu tidak semua evaluasi jika mereka tidak harus (mis. A atau B atau C selalu benar jika A benar, jadi berhentilah mengevaluasi apakah A benar)
Bisakah seseorang menjelaskan di sini? Juga, apakah ada AndAlso dan OrElse di R?
Jawaban:
Yang lebih pendek adalah vektor, artinya mereka dapat mengembalikan vektor, seperti ini:
Bentuk yang lebih panjang mengevaluasi dari kiri ke kanan hanya memeriksa elemen pertama dari setiap vektor, sehingga memberi di atas
Seperti yang dikatakan halaman bantuan, ini membuat formulir yang lebih panjang "sesuai untuk aliran kontrol pemrograman dan biasanya lebih disukai di dalam klausa if."
Jadi, Anda ingin menggunakan formulir panjang hanya jika Anda yakin vektornya panjang satu.
Anda harus benar - benar yakin vektor Anda hanya panjang 1, seperti dalam kasus di mana mereka adalah fungsi yang hanya mengembalikan panjang 1 boolean. Anda ingin menggunakan formulir pendek jika vektornya panjang mungkin> 1. Jadi jika Anda tidak benar-benar yakin, Anda harus memeriksa dulu, atau menggunakan formulir pendek dan kemudian menggunakan
all
danany
menguranginya menjadi panjang untuk digunakan dalam laporan aliran kontrol, sepertiif
.Fungsi
all
danany
sering digunakan pada hasil perbandingan vektor untuk melihat apakah semua atau salah perbandingan benar, masing-masing. Hasil dari fungsi-fungsi ini pasti panjang 1 sehingga mereka cocok untuk digunakan dalam klausa if, sedangkan hasil dari perbandingan vektor tidak. (Meskipun hasil tersebut akan sesuai untuk digunakan diifelse
.Satu perbedaan terakhir:
&&
dan||
hanya mengevaluasi sebanyak mungkin istilah yang mereka perlukan (yang tampaknya merupakan yang dimaksud dengan hubungan arus pendek). Misalnya, inilah perbandingan menggunakan nilai yang tidak ditentukana
; jika tidak korsleting, seperti&
dan|
tidak, itu akan memberikan kesalahan.Akhirnya, lihat bagian 8.2.17 dalam The R Inferno , berjudul "and and andand".
sumber
c(TRUE, FALSE)
, danif
pernyataan itu tidak akan jelas. Jika Anda yakin semuanya memiliki panjang 1, maka ya, keduanya akan melakukannya, dan Anda benar bahwa "korsleting" adalah alasan untuk memilih satu. Namun, kata peringatan, pastikan Anda 100% yakin panjangnya hanya satu. Anda bisa mendapatkan bug yang benar-benar konyol jika tidak.?is.R
untuk memeriksa apakah Anda menjalankan R atau S-Plus.if(exists("is.R") && is.function(is.R) && is.R())
. Jikais.R
tidak ada, maka Anda tidak ingin mengevaluasiis.function(is.R)
karena akan menimbulkan kesalahan. Demikian juga jikais.R
bukan fungsi, Anda tidak ingin menyebutnya seolah-olah itu fungsi.Jawaban tentang "korsleting" berpotensi menyesatkan, tetapi memiliki beberapa kebenaran (lihat di bawah). Dalam bahasa R / S,
&&
dan||
hanya mengevaluasi elemen pertama dalam argumen pertama. Semua elemen lain dalam vektor atau daftar diabaikan terlepas dari nilai yang pertama. Mereka operator dirancang untuk bekerja denganif (cond) {} else{}
konstruksi dan untuk program pengendalian langsung daripada membangun vektor baru .. The&
dan|
operator yang dirancang untuk bekerja pada vektor, sehingga mereka akan diterapkan "secara paralel", sehingga untuk berbicara, sepanjang argumen terpanjang. Kedua vektor perlu dievaluasi sebelum perbandingan dibuat. Jika vektornya tidak sama panjang, maka daur ulang argumen yang lebih pendek dilakukan.Ketika argumen ke
&&
atau||
dievaluasi, ada "hubungan arus pendek" di mana jika salah satu nilai berturut-turut dari kiri ke kanan adalah determinatif, maka evaluasi berhenti dan nilai akhir dikembalikan.Keuntungan dari hubungan arus pendek hanya akan muncul ketika argumen membutuhkan waktu lama untuk mengevaluasi. Itu biasanya akan terjadi ketika argumen adalah fungsi yang memproses objek yang lebih besar atau memiliki operasi matematika yang lebih kompleks.
sumber
&&
dan||
.&&
berfungsi dan yang pertama salah, maka yang kedua tidak akan dievaluasi. Itu tidak benar untuk salah satu&
atauifelse
yang akan mengevaluasi kedua argumen.&&
dan||
apa yang disebut "hubungan arus pendek". Itu berarti bahwa mereka tidak akan mengevaluasi operan kedua jika operan pertama cukup untuk menentukan nilai ekspresi.Misalnya jika operan pertama
&&
salah, maka tidak ada gunanya mengevaluasi operan kedua, karena operan tidak dapat mengubah nilai ekspresi (false && true
danfalse && false
keduanya salah). Hal yang sama berlaku||
ketika operan pertama benar.Anda dapat membaca lebih lanjut tentang ini di sini: http://en.wikipedia.org/wiki/Short-circuit_evaluation Dari tabel di halaman itu Anda dapat melihat yang
&&
setara denganAndAlso
di VB.NET, yang saya anggap Anda maksud.sumber
f <- function() { print('hello'); TRUE }; FALSE && f()
. Ubah&
dan perhatikan bahwa fungsi tersebut dievaluasi. QED.&&
dan||
korsleting. Tapi itu benar-benar poin yang cukup kecil dalam perbandingan antara bentuk pendek dan bentuk panjang; jauh lebih penting untuk memahami apa yang dilakukan masing-masing ketika inputnya adalah vektor.F & {message("Boo!");T}
danF && {message("Boo!");T}
.