Atama operatörleri =
ile <-
R arasındaki farklar nelerdir ?
Örneğinizin gösterdiği =
ve <-
biraz farklı operatör önceliğine sahip olma (aynı ifadede karıştırıldıklarında değerlendirme sırasını belirler). Aslında, ?Syntax
R'de en yüksekten en alta aşağıdaki operatör öncelik tablosunu verir:
…
‘-> ->>’ rightwards assignment
‘<- <<-’ assignment (right to left)
‘=’ assignment (right to left)
…
Ama tek fark bu mu?
Atama operatörlerini sorduğunuz için : evet, tek fark bu. Ancak, başka türlü inandığınız için affedilirsiniz. Daha ?assignOps
fazla farklılık olduğu iddialarının R belgeleri bile :
Operatör <-
her yerde kullanılabilirken operatöre =
yalnızca en üst düzeyde (örn. Komut istemine yazılan tam ifadede) veya hazır ifadeler listesindeki alt ifadelerden biri olarak izin verilir.
Üzerine çok ince bir nokta koymayalım : R belgeleri (ince) yanlıştır [ 1 ] . Bunu göstermek kolaydır: sadece =
(a) en üst seviyede olmayan (b) ifadelerin hazır ifadeler listesinde (yani {…; …}
) bir alt ifade olmayan operatörün bir karşı örneğini bulmamız gerekir . - Daha fazla uzatmadan:
x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1
Açıkçası =
(a) ve (b) bağlamlarının dışında bir ödev gerçekleştirdik . Öyleyse, neden temel R dili özelliğinin belgeleri on yıllardır yanlış?
Çünkü R'nin sözdiziminde sembolün =
rutin olarak sınırlanan iki farklı anlamı vardır:
- İlk anlamı bir atama operatörü olarak . Şimdiye kadar bahsettiğimiz tek şey bu.
- İkinci anlamı bir operatör değil, bir değil belirteç sözdizimi o sinyalleri geçen argüman adında bir işlev çağrısında.
=
Operatörün aksine, çalışma zamanında hiçbir eylem gerçekleştirmez, yalnızca bir ifadenin ayrıştırma şeklini değiştirir.
Bakalım.
Genel formdaki herhangi bir kodda…
‹function_name›(‹argname› = ‹value›, …)
‹function_name›(‹args›, ‹argname› = ‹value›, …)
… =
İsimlendirilmiş argüman geçişini tanımlayan belirteç: atama operatörü değildir . Ayrıca, bazı sözdizimsel bağlamlarda =
tamamen yasaktır :
if (‹var› = ‹value›) …
while (‹var› = ‹value›) …
for (‹var› = ‹value› in ‹value2›) …
for (‹var1› in ‹var2› = ‹value›) …
Bunlardan herhangi biri ‹bla› 'de “beklenmedik' = 'hatası verecektir.
Başka bir bağlamda, =
atama operatörü çağrısına karşılık gelir. Özellikle, yalnızca alt ifadenin etrafına parantez koymak, yukarıdaki (a) ve (b) 'den herhangi birini bir ödeve dönüştürür . Örneğin, aşağıdakiler atamayı gerçekleştirir:
median((x = 1 : 10))
Ayrıca:
if (! (nf = length(from))) return()
Şimdi böyle bir kodun iğrenç olduğuna itiraz edebilirsiniz (ve haklı olabilirsiniz). Ama bu kodu aldı base::file.copy
(yerine fonksiyonu <-
ile =
çekirdek R kod temeli çok yaygın bir model olduğunu -).
John Chambers tarafından orijinal açıklama R belgelerine muhtemelen dayanmaktadır, aslında doğru açıklıyor:
[ =
atamaya] dilbilgisinde yalnızca iki yerde izin verilir: en üst düzeyde (tam bir program veya kullanıcı tarafından yazılan ifade olarak); ve çevreleyen mantıksal yapıdan, parantez veya ekstra bir parantez çifti ile izole edildiğinde.
Bir itiraf: Daha önce yalan söyledim. Orada olan arasında bir ilave fark =
ve <-
operatörler: bunlar ayrı işlevleri çağırmak. Varsayılan olarak bu işlevler aynı şeyi yapar, ancak davranışı değiştirmek için bunlardan birini ayrı ayrı geçersiz kılabilirsiniz. Aksine <-
ve ->
(soldan sağa atama), sözdizimsel olarak farklı olsa da, her zaman aynı işlevi çağırın . Birini geçersiz kılmak diğerini de geçersiz kılar. Bunu bilerek nadiren pratiktir ama olabilir bazı eğlenceli Oyun oynamak için kullanılabilir .
<-
sembolü aslında tek vardı eski APL klavyeler geliyor<-
onlara anahtarı.