2011-09-14 21 views
6

R'de bir karma haritayı kullanmanın bir yolunu bulmaya çalışıyorum ve bazı aramalardan sonra R-ortamını aldım. Ancak, bir ortamdaki tüm öğeler arasında nasıl yineleyebilirim? Böyle Aşağıdaki kodu çalıştırdığınızda , bekliyordum çıkışı:Bir R ortamında karma öğeler nasıl yinelenir?

Ama NULL yerine iki satır olsun, nasıl ben istediğimi alabilirim?

map <- new.env(hash=T, parent=emptyenv()) 
assign('a', 1, map) 
assign('b', 2, map) 
for (v in ls(map)) { 
    print(map$v) 
} 
+0

'ls', isimleri değil nesneleri döndürür. Yazdırmayı deneyin (harita [[v]] ' –

cevap

10

Girdi yorumlamak istenen bir işlev içinde "$" kullanımı yaygın bir programlama hatası kaynağıdır. Bunun yerine, form nesnesini [[value]] (tırnak işaretleri olmadan kullanın)

for (v in ls(map)) { 
    print(map[[v]]) 
} 
+0

Teşekkürler adam, işe yarıyor! –

7

Ne yapmak istediğinize bağlıdır. Yukarıdaki print örneğinizin örnek olarak yaptığınız bir şey olduğunu, ancak yazdırmadan daha fazlasını yapmak istediğinizi varsayalım!

Bir ortamın her öğesine dayalı bir nesne almak istiyorsanız, eapply(env, function) kullanın. Diğer *apply() işlevleri gibi çalışır. Nesneleri, eapply()'a iletilen ve adlarının çevreden kopyalandığı işlevden oluşturduğunuz nesneler olan bir liste döndürür. Özel durumda

map <- new.env(hash=T, parent=emptyenv()) 
assign('a', 1, map) 
assign('b', 2, map) 

eapply(map, identity) 

Örneğin

, iki elemanlarının bir listesini döndürür. Bir karma tabloyu bir ortam yerine bir liste olarak uygulayabileceğinizi gösteren bir hash tablosuna çok benziyor (biraz alışılmışın dışında, ama kesinlikle ilginç). bunun yerine bir ortamın elemanların her biri için şey yapmak istiyorsanız bu bazı önemsiz olmayan, özel fonksiyon için nasıl çalışacağını görmek için

, burada dönmeden, örnek

eapply(map, function(e) { 
    # e here stands for a copy of an element of the environment 
    e <- my.function(e) 
    my.other.function(e) 
}) 

olduğunu Sonunda bir liste nesnesi, @DWin gibi bir for döngüsü kullanmalısınız.

Endişelenmem, gerçekten sadece yazdırmak istemeyeceğiniz, ancak sonunda "hash tablosu" öğelerinize dayalı nesneler oluşturacağınız ve daha sonra işlenecek bir listeye geri göndereceğinizdir. Bu durumda, eapply()'u kullanmalısınız. Kod daha temiz olacak ve R'nin deyimine daha yakın olacak. Yinelenen ve sizin için sonuçların listesini oluşturmaya özen gösterir.

+0

OP'nin problemini çözmek için bir örnek vermek daha iyi olurdu:“ eapply (harita, kimlik) ” – James

+0

OP'nin problemi, onun nasıl yineleneceğini bilmemesidir. Çevre ve bunu yapmak için kullanışlı bir işlevden bahsetmiştim.R r'in deyimlerini oldukça iyi takip eden bir tane: – adamleerich

+0

Doğru, ama aynı zamanda belirli bir vaka kullanımı vardı, cevap şimdi daha iyi, bu yüzden benden bir oy var. : "Yazdır" ifadesi, '' apply' ifadelerinde kullanıldığında beklediğiniz her şeyi vermez. – James

İlgili konular