2014-04-07 18 views
6

R (Ben bir Python arka planından geliyorum) için yeniyim ve hala apply işlevlerini nasıl/ne zaman uygulayacağını anlamakla ilgili bazı sorunlar yaşıyorum (gecikmeli, sapply, iç içe döngüler yerine rapply, vb. Örnek olarak, bir listenin her bir elemanını başka bir listenin her elemanı ile karşılaştıran FUN fonksiyonunu gerçekleştirmek istediğini varsayalım. Başka bir deyişleR - İç içe döngü yerine 'uygula' kullanmanın temel anlayışı

n = 1 
m = 1 
sameList = NULL 
for(i in 1:length(list1)){ 
    for(j in 1:length(list2)){ 
     if(list1[n]==list2[m]){ 
      sameList<-c(sameList, list1[n]} 
    n = n+1 
    } 
m = m+1 
} 

, her listenin her elemanını üzerinde dolaşır bazı iç içe döngü: Ben çizgisinde bir şeyler yazmak istiyorum.

Öğrenmekte olduğum şey, bir listenin orta döngüsünün birleştirilmesi, R'de çok verimsiz bir işlemdir, bu nedenle apply kullanılmasının nedeni budur.

Yukarıdaki örnek kodu değiştirmek için apply (veya herhangi bir sürümü) nasıl kullanılır?

+0

, muhtemelen yararlı olacaktır. Ayrıca, belki bu son blog yazısı yararlıdır: http://www.r-bloggers.com/functional-programming-in-r/ (Daha sonra döngülere bakar) – Froom2

+1

Bu "listeler" in her ikisini de çağırıyorsunuz ama Onları vektörlermiş gibi altüst ediyorsunuz. Lütfen R soruları sorulurken dikkatli olun. "Liste", belirli bir anlam ifade eder ve çoğu zaman, "vektör" veya "atomik vektör" ten farklı olarak, R. – joran

+1

'da bir şey ifade eder, sadece bir tahmin işlevini istediğinizi düşünmüyorum. Dış (1: 5,1: 5, FUN = "==") 'yi çalıştırmayı denemek ve bunun sizin için daha anlamlı olup olmadığını görmek. – joran

cevap

7

, sen aday olacağını: listelerin örnekleri ekleyin eğer özel örneğe karşılık

sameList = lapply(list1, function(x) lapply(list2, function(y) if (x==y) x else NULL)) 
+3

Bir R listesi ve bir R vektörü arasındaki farkın bilinmesi daha sonra size yardımcı olacaktır, çünkü tekrarlanabilir örnekler yayınlayacaktır (sizin listenizde 'list1' veya' list2' tanımlamıyorsunuz, bu yüzden listeler mi yoksa vektörler mi olduklarını bilmiyoruz Büyük bir fark var). – Spacedman

+0

Ben liste vs vektör şeyi kontrol etmenizi tavsiye ederim, ama umarım bu 'dong' ve iç içe döngüler 'R '(' dış 'başka iyi bir seçenek) ele alınır nasıl biraz daha net yaptı. Burada soru sorduğunuzda, ilgisiz birçok geribildirim bekleyebilirsiniz - bazıları iyi olacak ve bazıları süper yardımcı olmayacaktır. –

0

Bu özel durumda, I

sameList <- intersect(list1, list2) 

Ayrıca R terminoloji biz bir tip koleksiyonlarına vector kullanımı anlamına gelir kullanmak; list s farklı tiplerde bulunmasına izin verilir. Döngülerden kaçınma, estetik bir sorundur, çünkü döngülerin performansının uygulanmasına kıyasla performansı daha iyidir - ancak fark ettiğiniz performans düşüşü muhtemelen aynı LİTER'lerin büyüklüğünü sürekli olarak değiştirmekten kaynaklanır (ve kodunuzda doğal olarak döngüsel olan herhangi bir şeyden daha fazla bellek ayırma). lapply kullanmak için

İlgili konular