2010-06-22 18 views
5

nesnelere dönüşüyor liste öğeleri,:R: Bu gibi el oluşturduk nesnelerin bir listesi var

rand1 <- rnorm(1e3) 
rand2 <- rnorm(1e6) 

myObjects <- NULL 
myObjects[[1]] <-rand1 
myObjects[[2]] <-rand2 
names(myObjects) <- c("rand1","rand2") 

Ben nesneleri gruplar halinde düzenler ve S3 onları koyar bazı kod üzerinde çalışıyorum . Sonra EC2'de myObjects listesini almak ve 'otomatik olarak' ayırmak istediğim bir kod var. Bu örnekte, listede sadece iki nesne vardır ve isimler bilinir, ancak herhangi bir uzunlukta ve herhangi bir ismin listelerini işlemek için bunu nasıl kodlarım?

#pseudo code 
for each thing in myObjects 
    thing <- myObjects[[thing]] 

Oldukça adları (myObjects) almaya anlamaya [1] ve ben myObjects içeriğini [[1]] atar hangi bir nesnenin adını çevirmek mümkün değil. Döngüleri halledebilirim ama her nesneyi yaratabilirim. Eminim ki bu oldukça basit, ama ben bunu pek düşünemiyorum.

+0

İlgili: http: // yığını http://stackoverflow.com/questions/2679193/how-to-name-variables-on-the-fly- in-r, http://stackoverflow.com/questions/2899581/assign-subset-of-parent-table-to-objects-in-r, http://stackoverflow.com/questions/2907896/how-to- a-variable-of-a-variable-in-a-variable-in-a-değişkeninin atama-a- – Marek

+1

Bağlantıları için teşekkürler Marek. Bu, arama için bir çeşit 'köşe çözümü' haline gelir. İstediğimi yapan işlevi bildiğimde, ilgili soruları bulmak çok daha kolay. Gerçekten zor bir şey, sorunun sadece kısa bir açıklamasıyla oraya nasıl gidileceğini bulmaktır! –

cevap

10

Sen assign kullanabilirsiniz:

for(i in 1:length(myObjects)) assign(names(myObjects)[i], myObjects[[i]]) 
+0

assign() ... eksik olduğum parça bu! Bana ve Richie'ye doğru yolda olduğun için teşekkürler. –

+3

'seq_along (myObjects)' biraz daha güvenli ise, 'length (myObjects) == 0' – hadley

+0

@hadley: Teşekkürler! seq_along() harika bir keşif. Aşağıdaki örneklerde olduğu gibi: bad = 'için (i'de 1: uzunluk (NULL)) print (i)', good = 'için (iq (seq_along (NULL)) baskı (i)' – Shane

5

Shane'nin cevabı genişletmek için:

mapply(assign, names(myObjects), myObjects, MoreArgs=list(envir = globalenv()) 

(başka bir ortama globalenv() değiştirmek isteyebilirler.)

+0

ortamları değiştirmek hakkında çok iyi bir fikir . Bunu kullanmalıyım. Bu bir bonus fikir! –

+0

Bu örnekte, rand1 ve rand2 nesnelerini oluşturduğumu görüyorum, ama aynı zamanda myObjects nesnesini de çıktı gibi görünüyor. Bu mapply() öğesinin sonuçlarını bir nesneye atarsam, myObjects PLUS rand1 ve rand2'nin bir kopyası ile sonuçlanır. Kinda gürültülü ve verimsiz görünüyor. Bu farklı bir tat uygulaması mı? –

6

attach(myObjects)

+2

Temel olarak attach() 'ı kelime dağarcığımdan çıkarmıştım çünkü çoğu insanın kullandığı yolun izlemesi zor olan kimi tuhaf kodlarla sonuçlandığını keşfettim. Bu yüzden bu durumda kullanmayı düşünmedim bile. Ama şimdi bahsettiğine göre, bence bu gerçekten iyi bir çözüm. Küçük kutumun dışında düşünmeme yardım ettiğin için teşekkürler. –

+0

+1 Bu kullanımın da dikkate alınmamış olması. – Shane

+2

Eklentiyi kullanmanın iyi bir fikir olduğunu sanmıyorum. Ama eğer kullanacaksan, kullan, kendi versiyonunu yazma. – hadley

İlgili konular