2014-07-11 13 views
8

izin verilir, ancak yalnızca % % operatörleri gibi kabul edildiğini görünüyor. o % % gibi değil örneğin, >>, ya da bir şey gibi operatörleri tanımlamak için bu kısıtlama dolaşmak mümkün mü?Operatörü %% olmadan tanımlamak mümkün mü? R kullanıcı tanımlı operatörler ise

Operatör, 1 >> 2 gibi kullanabilmemiz için gerçek bir operatör olmalı ve ">>"(1,2) gibi kullanmak zorunda değil.

+1

bir operatör olarak kullanılmasını '>>' olsalar bile: ama bu en az biri iyi bir örnek, daha az ayrıntılı lambdas tanımlamak Varlığından - Bu nadiren mantıklı olur gibi görünüyor Sadece tırnak veya backticks kullanarak erişebilirsiniz. Ve sonra bile, nadiren uygun bir şekilde. Örnek: '\' >> \ '<- \'+\'; ">> '(4, 2)' – A5C1D2H2I1M1N2O1R2T1

+0

Evet: örnekler için bkz. 'Sos :: ???' veya 'cgwtools :: splatnd'.Ama verilen tüm uyarıları dikkate almayın cevaplar ve yorumlar –

cevap

4

Böyle şeyler yapabilirsiniz, ama tedbirli olmak için yeni bir çevreye bu nesneleri atamak isteyebilirsiniz.

> "^" <- function(x, y) `-`(x, y) ## subtract y from x 
> 5^3 
# [1] 2 

> "?" <- function(x, y) sum(x, y) ## add x and y 
> 5 ? 5 
# [1] 10 
+5

Bunlar sadece işe yarayan bir işleç yeniden atayacağınız için çalışıyor (örneğin '^' ünsüzleştirme için kullanılır ve '' normalde yardım içindir.] Eğer '<<' gibi farklı bir sembol seti kullanmaya çalışırsanız çözümleyici anlayamaz ve bir hata atar.Tüm diğer işlevleri standart tanımlarına dayanarak yeniden atamak muhtemelen iyi bir fikir değildir .. – MrFlick

+1

@MrFlick Bu önemli bir uyarı olsa da, operatörleri dikkatlice geçersiz kılmanın bir yolunun cevabını görün, Bu kısıtlama etrafında çalışır –

+1

Ayrıca farklı bir ortama atayabilirsiniz, doğru? Kendi çevre. –

12

No. R sadece

  1. Redefine mevcut operatörleri (aslında <- gibi + veya) olanak sağlar
  2. %…% ile bunları çevreleyen yeni çatı ve çatı operatörleri tanımlar.

Bunlar biz uygun oynamak zorunda kurallardır. Ancak, bu kuralların içinde hepsi adil ve oyunlar. karakter dizeleri normal anlamını (toplama) yok etmeden, birleştirme gerçekleştirmek için Örneğin, + yeniden tanımlayabilirsiniz:

> `+` 
function (e1, e2) .Primitive("+") 

Biz numaralar için korumak istiyorsanız eski tanım vardır:

> `+.default` = .Primitive('+') 
> `+.character` = paste0 
> `+` = function (e1, e2) UseMethod('+') 
> 1 + 2 
[1] 3 
> 'hello' + 'world' 
[1] "helloworld" 

Bu, ilk argümanının türünde + jenerik yapmak için S3 sınıf sisteminden yararlanır.

böylece yeniden tanımlanabilir operatörlerin listesi oldukça eklektik.

+, -, *, /, ^, **, &, |, :, ::, :::, $, $<-, =, <-, <<-, ==: İlk sayımda aşağıdaki operatör içeriyor , <, <=, >, >=, !=, ~,(modules source code Alındığı.)&&, ||, !, ?, ??, @, @<-

Ayrıca, <- yeniden tanımlayarak -> geçersiz kılabilir.Size

> sapply(1 : 4, x -> 2 * x) 
[1] 2 4 6 8 

Implementation as a gist