Apa perbedaan antara operator penugasan =
dan <-
dalam R?
Seperti yang ditunjukkan contoh Anda, =
dan <-
memiliki prioritas operator yang sedikit berbeda (yang menentukan urutan evaluasi ketika mereka dicampur dalam ekspresi yang sama). Bahkan, ?Syntax
dalam R memberikan tabel prioritas operator berikut, dari tertinggi ke terendah:
…
‘-> ->>’ rightwards assignment
‘<- <<-’ assignment (right to left)
‘=’ assignment (right to left)
…
Tetapi apakah ini satu-satunya perbedaan?
Karena Anda bertanya tentang operator penugasan : ya, itulah satu-satunya perbedaan. Namun, Anda akan dimaafkan karena percaya sebaliknya. Bahkan dokumentasi R dari ?assignOps
klaim bahwa ada lebih banyak perbedaan:
Operator <-
dapat digunakan di mana saja, sedangkan operator =
hanya diperbolehkan di tingkat atas (misalnya, dalam ekspresi lengkap yang diketik di command prompt) atau sebagai salah satu subekspresi dalam daftar ekspresi yang diperkuat.
Jangan terlalu menekankan hal itu: dokumentasi R (secara halus) salah [ 1 ] . Ini mudah ditunjukkan: kita hanya perlu menemukan contoh tandingan dari =
operator yang tidak (a) di tingkat atas, atau (b) subekspresi dalam daftar ekspresi yang diperkuat (yaitu {…; …}
). - Tanpa basa-basi:
x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1
Jelas kami telah melakukan tugas, menggunakan =
, di luar konteks (a) dan (b). Jadi, mengapa dokumentasi fitur bahasa R inti salah selama beberapa dekade?
Itu karena dalam sintaks R simbol =
memiliki dua makna berbeda yang secara rutin digabungkan:
- Arti pertama adalah sebagai operator penugasan . Ini semua yang kita bicarakan sejauh ini.
- Arti kedua bukanlah operator melainkan token sintaksis yang memberi sinyal argumen bernama lewat dalam panggilan fungsi. Tidak seperti
=
operator yang tidak melakukan tindakan saat runtime, itu hanya mengubah cara ekspresi diurai.
Ayo lihat.
Dalam bentuk kode apa pun dari bentuk umum ...
‹function_name›(‹argname› = ‹value›, …)
‹function_name›(‹args›, ‹argname› = ‹value›, …)
… The =
adalah token yang mendefinisikan lewat argumen: itu bukan operator penugasan. Lebih jauh lagi, =
sepenuhnya dilarang dalam beberapa konteks sintaksis:
if (‹var› = ‹value›) …
while (‹var› = ‹value›) …
for (‹var› = ‹value› in ‹value2›) …
for (‹var1› in ‹var2› = ‹value›) …
Semua ini akan menimbulkan kesalahan “tak terduga '=' di ‹bla›”.
Dalam konteks lain, =
merujuk pada panggilan operator penugasan. Secara khusus, hanya menempatkan tanda kurung di sekitar subekspresi membuat salah satu dari yang di atas (a) valid, dan (b) tugas . Misalnya, berikut ini melakukan tugas:
median((x = 1 : 10))
Tetapi juga:
if (! (nf = length(from))) return()
Sekarang Anda mungkin keberatan bahwa kode seperti itu mengerikan (dan Anda mungkin benar). Tapi saya mengambil kode ini dari base::file.copy
fungsi (ganti <-
dengan =
) - ini adalah pola meresap di banyak basis kode R inti.
The penjelasan asli oleh John Chambers , yang dokumentasi R yang mungkin didasarkan pada, sebenarnya menjelaskan ini dengan benar:
[ =
penugasan] diizinkan hanya di dua tempat dalam tata bahasa: di tingkat atas (sebagai program lengkap atau ungkapan yang diketik pengguna); dan ketika terisolasi dari struktur logis sekitarnya, dengan kawat gigi atau sepasang kurung tambahan.
Sebuah pengakuan: Saya berbohong sebelumnya. Ada adalah satu perbedaan tambahan antara =
dan <-
operator: mereka memanggil fungsi-fungsi yang berbeda. Secara default fungsi-fungsi ini melakukan hal yang sama tetapi Anda dapat menimpa keduanya secara terpisah untuk mengubah perilaku. Sebaliknya, <-
dan ->
(tugas dari kiri ke kanan), meskipun secara sintaksis berbeda, selalu memanggil fungsi yang sama . Mengesampingkan satu juga mengesampingkan yang lain. Mengetahui hal ini jarang praktis tetapi dapat digunakan untuk beberapa shenanigans yang menyenangkan .
<-
simbol berasal dari keyboard APL lama yang sebenarnya memiliki satu<-
kunci saja.