2015-01-30 24 views
5

olarak adlandırılan her seferinde tekrar yeniden değerlendirmek geliştirici değilim ve basit kelimelerle ihtiyacım olan şeyi iyi ifade edemiyorum. Ortamlar, kapsam belirleme, muhafaza ve belki de işaretçiler ve referanslar gibi şeylere bağlanır.R, hangi fonksiyonun geri döndüğüne eşit bir değişken atayacaktır.

Bu kod ile açık olmalıdır:

a<-c(1,2) 
b<-length(a) 
a<-c(1,2,3) 
b 
[1] 2 

istediğim b ikinci satırda ne değiştiririm 3.

dönmek için? Yeni özel fonksiyonlar tanımlamaksızın ve harici paketler kullanmadan yapmak mümkün mü?

eval, atamak çalışırken Başarısız

, < < - Şimdiye kadar

cevap

6

Ben aslında bunu kullanması gerektiğini tavsiye etmiyorum, ama makeActiveBinding() soruyormuşsun yapacak:

makeActiveBinding("b", function() length(a), .GlobalEnv) 
a <- c(1,2) 
b 
# [1] 2 
a <- c(1,2,4) 
b 
# [1] 3 
+0

Şaşırtıcı. Bu konuda daha fazla bilgiyi okuyabileceğim en iyi bilgi kaynağı (ör. Kitap) (yalnızca googling ciltleme için hariç). Diğer programlama dillerinde veya ilgili konularda bu bağlamanın "eşanlamlıları" var mı? Aynı zamanda kabuk betiklerinde benzer bir şey kullanmak isterim - aynı zamanda bash'taki bağlayıcı olarak da adlandırılır mı? – stuckNlazy

+0

Hmm. Emin değil. Ancak temel fikir, sahnelerin ardında, 'b' yazısının her seferinde değerlendirildiği uzunluk (a) fonksiyonunu çalıştırmasıdır. Şahsen, basit bir işlev olan b <- function() length (a) 'yi tanımlamak ve daha sonra' a' uzunluğunu almak için b() 'yi (b' yerine) yapmak çok daha rahat olurdu. Böylelikle, "sihirli" sihirbazının, "makeActiveBinding" öğesinin bile "deneysel bir arabirim" olarak tanımladığı sahnelerin gerisinde kalmasını sağlarsınız. Sadece ek '()' yi yazarak, basit işlev tanımlarının ve işlev çağrılarının daha ana dünyasında kalabilirsiniz. –

+0

@ JoshO'Brien - Bunu yorumlarda bırakmak yerine yanıtı ekleyebilirim. Söylediğin her şey bana çok akıllıca görünüyor. – thelatemail